2011-01-13 42 views
1

我有兩個表連接2個字段。第一個表中的某些行與第二個錶鏈接,有些不是。我怎樣才能選擇那些沒有鏈接到第二個表的?我模擬了這種情況。如何從SQL Server中未鏈接到另一個表的表中選擇行?

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語句是選擇我已經成功的所有鏈接行。

第二個聲明是選擇所有沒有鏈接的行..我仍然試圖找出。

subtblnewno鏈接到(cat*10000)+qnomaintbl

subtblidno1鏈接到idnomaintbl

回答

1

您需要執行正確的ANSI JOI N(!不是table,table,table....式聯接 - 這是過時 - 停止使用它),然後你需要做一個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 
+0

一些括號只好作罷,但爲什麼不把它們全部?他們不需要。 ON m.cat * 10000 + m.qno = s.newno AND m.idno = s.idno1 – tponthieux 2011-02-26 11:33:15

1

你接近 - 你做左加入,但然後做一個在哪裏可以找到maintbl沒有匹配子行的行

select * from maintbl 
left join subtbl on (((cat*10000)+qno)=newno) and (idno=idno1) 
where newno IS NULL 
相關問題