这个SQL查询出了什么问题?

时间:2014-02-19 06:46:16

标签: sql sql-server

我有两张表BankMaster#tmp_BankMaster#tmp_BankMaster表继承自BankMaster表。因此,数据结构是相同的。甚至#tmp_BankMaster表中也存在一些数据与BankMaster相同。现在,我想将#tmp_BankMaster中的所有不存在的数据插入BankMaster。我创建了一个查询。但是,不知道它如何给出错误主键约束:“无法插入重复键”。

INSERT INTO BankMaster 
   SELECT * 
   FROM #tmp_BankMaster 
   WHERE  
       BankID NOT IN (SELECT BankID FROM BankMaster 
                      WHERE BankMaster.BankID = #tmp_BankMaster.BankID 
                        AND BankMaster.CompanyID = #tmp_BankMaster.CompanyID )

我正在使用SQL Server 2005,并且在列CompanyIDBankID上创建了主键。它是一个复合键。

4 个答案:

答案 0 :(得分:5)

不,你不能使用NOT IN,但是你可以使用NOT EXISTS,你正在使用复合键,你需要确保从#tmp_BankMaster中选择那些你的复合键(BankID和CompanyID不是存在于BankMaster中)。试试这个

insert into BankMaster
 Select * From #tmp_BankMaster tmp
       where not exists (select 1 from BankMaster 
          master where master.BankID= tmp.BankID
          and master.CompanyID = tmp.CompanyID )

insert into BankMaster 
   SELECT *

    FROM #tmp_BankMaster 

     WHERE NOT EXISTS

     (SELECT *

        FROM #tmp_BankMaster

          WHERE BankMaster.BankID= #tmp_BankMaster.BankID

            AND BankMaster.CompanyID = #tmp_BankMaster.CompanyID 

     )

这也应该有效:

  INSERT INTO BankMaster 

   SELECT *

     FROM #tmp_BankMaster

     EXCEPT

      SELECT *

       FROM BankMaster 

答案 1 :(得分:0)

您需要检查要插入BankMaster的值。看起来好像是在尝试插入表中已存在的CompanyID和BankID的组合。

答案 2 :(得分:0)

n内在的地方放在“上”

Select * From #tmp_BankMaster t inner join BankMaster s
on t.CompanyID=s.CompanyID and  t.BankID NOT IN (Select BankID From BankMaster )

答案 3 :(得分:0)

要获得所需的独特记录是这样的

INSERT INTO BankMaster 
   SELECT * 
   FROM #tmp_BankMaster 
   WHERE  
       BankID NOT IN (SELECT BankID FROM BankMaster 
                      WHERE BankMaster.BankID = #tmp_BankMaster.BankID )
       AND 
      CompanyId NOT IN ( SELECT BankID FROM BankMaster 
                         WHERE BankMaster.CompanyID = #tmp_BankMaster.CompanyID )

但这又有性能问题。所以考虑使用Aftab Ahmed。

相关问题