如何从表中选择未链接到SQL Server中另一个表的行?

时间:2011-01-13 05:39:14

标签: sql-server sql-server-2005

我有两个由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}}

相关联

2 个答案:

答案 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