SQL SERVER多列子查询

今天,写导入数据的存储过程时,用到多列子查询,想把临时表里有的,而原表里没有的数据插入到原表里面。原表里若有了,就不用再插入了。

我当时这样写的:

USE SUBJECTDB_DATA;
   BEGIN TRAN;
   INSERT INTO SUBJECTDB.ProDefine.Project_Corporation
   SELECT pro.CODE,COR.CODE
   FROM BDD_PROJECTINFO_INSERT INS
   LEFT JOIN SUBJECTDB.PRODEFINE.Corporation COR ON INS.所属法人公司=COR.CNNAME
   LEFT JOIN SubjectDB.ProDefine.ProjectInfo pro ON INS.项目名称=PRO.CNNAME
   WHERE (PRO.CODE,cor.code) NOT IN (SELECT (PROJECTCODE,CorperationCode) FROM SUBJECTDB.ProDefine.Project_Corporation)

结果报错:

消息 4145,级别 15,状态 1,第 8 行
An expression of non-boolean type specified in a context where a condition is expected, near ','.
消息 102,级别 15,状态 1,第 8 行
Incorrect syntax near ','.
出错原因:oracle里面多列子查询可以这样写WHERE(col1,col2) NOT IN(SELECT (COL1,COL2) FROM ……),但SQL SERVER里面不支持。

解决办法:用CHECKSUM模拟。

如,改动如下,就可以了。

USE SUBJECTDB_DATA;
   BEGIN TRAN;
   INSERT INTO SUBJECTDB.ProDefine.Project_Corporation
   SELECT pro.CODE,COR.CODE
   FROM BDD_PROJECTINFO_INSERT INS
   LEFT JOIN SUBJECTDB.PRODEFINE.Corporation COR ON INS.所属法人公司=COR.CNNAME
   LEFT JOIN SubjectDB.ProDefine.ProjectInfo pro ON INS.项目名称=PRO.CNNAME
   where  checksum(PRO.CODE,COR.CODE) not in  (select checksum(PROJECTCODE,CorperationCode) FROM SUBJECTDB.ProDefine.Project_Corporation)

 还可以通过NOT EXISTS实现:

如:

USE SUBJECTDB_DATA;
   BEGIN TRAN;
   INSERT INTO SUBJECTDB.ProDefine.Project_Corporation
   SELECT pro.CODE,COR.CODE
   FROM BDD_PROJECTINFO_INSERT INS
   LEFT JOIN SUBJECTDB.PRODEFINE.Corporation COR ON INS.所属法人公司=COR.CNNAME
   LEFT JOIN SubjectDB.ProDefine.ProjectInfo pro ON INS.项目名称=PRO.CNNAME

  WHERE NOT EXISTS(SELECT *

                                                       FROM  SUBJECTDB.ProDefine.Project_Corporation P_COR

                                 WHERE P_COR.PROJECTCODE=PRO.CODE

                                             AND P_COR.CorperationCode=COR.CODE

                                                          )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值