2011-01-22 82 views
2

我有一個SQL Server 2005 表(#1)列出了員工姓名,以及有關他們每個人的各種信息。使用連接表來排除某些記錄

我有第二個表(#2),列出了一些,我想從我的結果中排除的員工。 (員工姓名可能出現在2列中的任意一列中:A和B.)

我可以使用EXCLUDE連接表嗎?

列出名爲Fred的所有員工table #1 ...但排除table #2中列出的某位員工。 如果Fred Smith列於table #2(在2個字段中),請不要在我的結果中列出他。 (但列出從table #1所有其他Fred記錄)

SELECT * 
FROM table1 AS t1, table2 AS t2 
WHERE ('Fred Smith' <> t2.employeeA) AND ('Fred Smith' <> t2.employeeB) 

(其實我不能讓它無論我是否使用加入了桌,或不工作)。

回答

9

有各種不同的方式來寫這個,但最好的表現(通常,數據分佈可以改變這一點)通常是存在測試。也很容易理解書面的確切意圖。

select * from table1 t1 
where not exists (
    select * from table2 t2 
    where t2.employeeA = t1.employee 
     or t2.employeeB = t1.employee) 

你總是可以嘗試另一種方式以及看哪個適合您

select t1.* 
from table1 t1 
left join table2 t2 on 
    t2.employeeA = t1.employee or t2.employeeB = t1.employee 
where t2.id is null -- check that the join failed by testing against the PK of t2 
更好