SQL - 违反唯一键约束
SQL - Violation of UNIQUE KEY constraint
我正在尝试为以下查询找到解决方案:
已宣布 tables @Country
和 @WHO
(世界卫生组织)。
将 table @Country
中所有可能的国家插入 table @WHO
.
table 的代码是:
DECLARE @Country TABLE
(
Id INT PRIMARY KEY IDENTITY(1,1),
Name NVARCHAR(100),
Capital NVARCHAR(100)
)
INSERT INTO @Country (Name, Capital)
VALUES ('China', 'Beijing'), ('Japan', 'Tokyo'),
('India', 'New Delhi'), ('South Korea', 'Seoul')
DECLARE @WHO TABLE
(
Id INT PRIMARY KEY IDENTITY(1,1),
Country NVARCHAR(100) UNIQUE
)
INSERT INTO @WHO (Country)
VALUES ('Japan'), ('South Korea')
我开始的代码如下所示:
INSERT INTO @WHO (w.Country)
SELECT DISTINCT c.Name
FROM @Country c
SELECT w.Country
FROM @WHO w
ORDER BY w.Country
最终结果应该是 table,其中包含:
China
India
Japan
South Korea
我知道这可能很简单,但我似乎找不到解决方案。
我的代码遗漏了什么? :(
您可以使用 not exists
:
INSERT INTO @WHO (w.Country)
SELECT DISTINCT c.Name
FROM @Country c
WHERE NOT EXISTS (SELECT 1 FROM @WHO w WHERE w.Country = c.Name)
一个(可能矫枉过正)替代方法是 MERGE
语法:
MERGE INTO @WHO w
USING (SELECT DISTINCT Name FROM @Country) c
ON (c.Name = w.Country)
WHEN NOT MATCHED BY TARGET
THEN INSERT (Country) VALUES(c.Country)
任务的预期查询是
INSERT INTO @WHO (Country)
SELECT
c.Name
FROM @Country c
LEFT JOIN @WHO w ON w.Country = c.Name
WHERE w.Id IS NULL
尽管我喜欢 'not exists' 版本,因为它更通用
我正在尝试为以下查询找到解决方案:
已宣布 tables @Country
和 @WHO
(世界卫生组织)。
将 table @Country
中所有可能的国家插入 table @WHO
.
table 的代码是:
DECLARE @Country TABLE
(
Id INT PRIMARY KEY IDENTITY(1,1),
Name NVARCHAR(100),
Capital NVARCHAR(100)
)
INSERT INTO @Country (Name, Capital)
VALUES ('China', 'Beijing'), ('Japan', 'Tokyo'),
('India', 'New Delhi'), ('South Korea', 'Seoul')
DECLARE @WHO TABLE
(
Id INT PRIMARY KEY IDENTITY(1,1),
Country NVARCHAR(100) UNIQUE
)
INSERT INTO @WHO (Country)
VALUES ('Japan'), ('South Korea')
我开始的代码如下所示:
INSERT INTO @WHO (w.Country)
SELECT DISTINCT c.Name
FROM @Country c
SELECT w.Country
FROM @WHO w
ORDER BY w.Country
最终结果应该是 table,其中包含:
China
India
Japan
South Korea
我知道这可能很简单,但我似乎找不到解决方案。
我的代码遗漏了什么? :(
您可以使用 not exists
:
INSERT INTO @WHO (w.Country)
SELECT DISTINCT c.Name
FROM @Country c
WHERE NOT EXISTS (SELECT 1 FROM @WHO w WHERE w.Country = c.Name)
一个(可能矫枉过正)替代方法是 MERGE
语法:
MERGE INTO @WHO w
USING (SELECT DISTINCT Name FROM @Country) c
ON (c.Name = w.Country)
WHEN NOT MATCHED BY TARGET
THEN INSERT (Country) VALUES(c.Country)
任务的预期查询是
INSERT INTO @WHO (Country)
SELECT
c.Name
FROM @Country c
LEFT JOIN @WHO w ON w.Country = c.Name
WHERE w.Id IS NULL
尽管我喜欢 'not exists' 版本,因为它更通用