SQL Server 2014插入NOT IN的位置

6 sql sql-server sql-insert sql-server-2014

有2个表.第一个有fname(名字),lname(姓),第二个有很多列,包括:( salutation先生,博士等),fname(名字),mname(中间名),lname(姓),独特标识和日期.

我希望创建包含第三表中Salutation,fname,mname,lname,uid,added从另外2本表中的信息,然后我将丢弃该第一表和重新创建第二表中删除那些列.

这就是我所拥有的:

CREATE TABLE MyTable
(
    Id  int  IDENTITY (1, 1) PRIMARY KEY,
    Salutation  varchar(20) NULL DEFAULT (NULL),
    Fname  varchar(30) NOT NULL,
    Mname  varchar(30) NULL DEFAULT (NULL),
    Lname  varchar(30) NOT NULL,
    Uid  uniqueidentifier NULL DEFAULT (NULL),
    Added  Date NOT NULL DEFAULT (getdate())
);

INSERT INTO MyTable (Fname, LName)
   SELECT Fname, Lname 
   FROM TABLE1
Run Code Online (Sandbox Code Playgroud)

这是我困惑的地方:

INSERT INTO MyTable (Salutation, Fname, Mname, LName, Uid, Added)
   SELECT 
      Salutation, Fname, Mname, LName, Uid, Added 
   FROM 
      Table2
   WHERE 
      Fname, Lname NOT IN (SELECT Fname, Lname FROM Table1)
Run Code Online (Sandbox Code Playgroud)

有人可以更正最后一个INSERT声明,以便它有效吗?

  1. 它不喜欢Fname, Lname这个WHERE词的右边
  2. 我应该先从第二张桌子插入第一张桌子吗?

pot*_*hin 7

您可以使用not exists相关子查询:

insert into MyTable (Salutation, Fname, Mname, LName, Uid, Added)
select Salutation, Fname, Mname, LName, Uid, Added from Table2 t
where not exists (select 1 from Table1 where Fname = t.Fname and Lname = t.Lname )
Run Code Online (Sandbox Code Playgroud)

更新

根据OP在下面的评论中提供的新条件,我可以确定应包括记录的两种可能情况:

  • 有一个fnamelname匹配;
  • 有一个Salutationlname匹配.

符合上述条件的查询如下:

insert into MyTable (Salutation, Fname, Mname, LName, Uid, Added)
select Salutation, Fname, Mname, LName, Uid, Added from Table2 t
where not exists (
   select 1 
   from Table1 
   where Lname = t.Lname and
       ( Fname = t.Fname or Salutation = t.Salutation )
)
Run Code Online (Sandbox Code Playgroud)