我有两个由2个字段链接的表。第一个表中的某些行链接到第二个表,有些则不是。如何选择未链接到第二个表的那些?我模拟了这种情况。
create table MainTbl(qno int, idno int, cat int);
create table SubTbl(newno int, idno1 int);
insert into maintbl values(1001, 88, 1);
insert into maintbl values(1002,88,1);
insert into subtbl values(11001, 88);
insert into subtbl values(11002,99);
insert into subtbl values(11003,88);
select * from maintbl,subtbl where (((cat*10000)+qno)=newno) and (idno=idno1);
select * from maintbl
left join subtbl on
(((cat*10000)+qno)<>newno) and (idno=idno1)
drop table maintbl;
drop table subtbl;
第一个select语句是选择我已经成功的所有链接行。
第二个声明是选择所有未链接的行...我仍然试图弄清楚。
newno
的{{1}}与subtbl
的{{1}}
(cat*10000)+qno
的{{1}}与maintbl
的{{1}}
答案 0 :(得分:1)
你已经关闭了 - 你做左连接但是然后做一个WHERE来找到没有匹配的子行的maintbl行
select * from maintbl
left join subtbl on (((cat*10000)+qno)=newno) and (idno=idno1)
where newno IS NULL
答案 1 :(得分:1)
你需要做一个正确的ANSI JOIN(不是table,table,table....
样式的JOIN - 不推荐使用它 - 停止使用它!)然后你需要做一个LEFT OUTER JOIN
来加入那些只存在的行mainTbl
在这些情况下,subTbl
的值为NULL:
SELECT *
FROM dbo.maintbl m
LEFT OUTER JOIN dbo.subtbl s ON (m.cat * 10000 + m.qno) = s.newno AND (m.idno = s.idno1)
WHERE s.newno IS NULL
这列出了mainTbl
中存在但subTbl
中不存在的所有行:
qno idno cat newno idno1
1002 88 1 NULL NULL