如何在多个键上使用反向JOIN进行INSERT?

Suk*_*tto 2 sql sql-server

如何使用多个键列进行反向连接?

在这个婴儿玩具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中删除行.如果可能的话,我也需要一次通过.

[编辑]谢谢你们!

SQL*_*ace 5

感谢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种不同的方法可以做到这一点

  • 不在(不会像你一样工作超过1列)
  • 不存在
  • 左和右加入
  • 外部申请(2005+)
  • 除外(2005+)

读取从一个表中选择另一个表中不存在的所有行


Qua*_*noi 5

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)