如何使用多个键列进行反向连接?
在这个婴儿玩具SqlServer示例中,我有以下内容
CREATE TABLE [dbo].[CarList](
[myID] [int] IDENTITY(1,1) NOT NULL,
[CarColour] [varchar](32) NOT NULL,
[CarName] [varchar](128) NOT NULL,
[CarCompany] [varchar](32) NOT NULL,
CONSTRAINT [PK_CarList] PRIMARY KEY CLUSTERED(
[myID] ASC,
[CarColour] ASC,
[CarName] ASC,
[CarCompany] ASC
)
)
GO
INSERT INTO CarList (CarColour, CarName, CarCompany)
VALUES('blue', 'Abe', 'Ford')
Run Code Online (Sandbox Code Playgroud)
在DB的其他地方我有一张像这样的桌子
CREATE TABLE [dbo].[NewCars](
[CarColour] [varchar](32) NOT NULL,
[CarName] [varchar](128) NOT NULL,
[CarCompany] [varchar](32) NOT NULL,
)
GO
INSERT INTO NewCars (CarColour, CarName, CarCompany)
SELECT 'blue', 'Abe', 'Ford'
UNION ALL
SELECT 'blue', 'Abe', 'GM'
UNION ALL
SELECT 'blue', 'Betty', 'Ford'
UNION ALL
SELECT 'green', 'Abe', 'Honda'
Run Code Online (Sandbox Code Playgroud)
现在我想在CarList表中插入我还没有的汽车
就像是...
INSERT INTO CarList ( CarColour, CarName, CarCompany)
SELECT DISTINCT new.CarColour, new.CarName, new.CarCompany
FROM NewCars new, CarList old
WHERE new.CarColour <> old.CarColour
AND new.CarName <> old.CarName
AND new.CarCompany <> old.CarCompany
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,因为"蓝色","贝蒂","福特"排将被过滤掉......
如果这只是某种ID,那真的很容易
INSERT INTO myTable (myID, param1, param2, etc)
SELECT param1, param2, etc
FROM someOtherTable new
WHERE new.myID NOT IN (SELECT myID FROM myTable)
Run Code Online (Sandbox Code Playgroud)
由于我不想进入的原因,我无法从与CarList匹配的NewCars中删除行.如果可能的话,我也需要一次通过.
[编辑]谢谢你们!
感谢DDL和DML
这是一种方式
INSERT INTO CarList ( CarColour, CarName, CarCompany)
SELECT DISTINCT *
FROM NewCars n
where not exists (select 1 from CarList c where c.CarColour =n.CarColour
and c.CarName = n.CarName
and c.CarCompany = n.CarCompany)
Run Code Online (Sandbox Code Playgroud)
至少有4种不同的方法可以做到这一点
INSERT
INTO CarList ( CarColour, CarName, CarCompany)
SELECT CarColour, CarName, CarCompany
FROM NewCars nc
WHERE NOT EXISTS
(
SELECT 1
FROM CarList cl
WHERE cl.CarColor = nc.CarColor
AND cl.CarName = nc.CarName
AND cl.CarCompany = nc.CarCompany
)
Run Code Online (Sandbox Code Playgroud)