當您加入時,您會得到部分笛卡爾產品。部分來自INNER JOIN條件。
因此,對於EM中分別有3行和4行的2行,輸出中會得到7行。如預期。你問:「給我所有匹配行的EM和PR的部分笛卡爾乘積」
但是,你想要「給我在EM裏有行的地方有PR的東西」。所以INNER JOIN是錯誤的結構。
您可以使用IN,EXISTS(或其他情況下的INTERSECT),並且它們對於後一個問題在語義上都是正確的。
在這種情況下,您使用IN是錯誤的地方。正如我之前所說,整個「測試」條件應該推入子查詢中。
因此,這兩種都是正確的
停止所有的加盟條件!
select
EM.Employee, rtrim(EM.FirstName) + ' ' + rtrim(EM.LastName) as Name
from
EM EM
WHERE
EXISTS (SELECT *
FROM
PR PR
JOIN
TabFields TF ON PR.WTS1 = TF.WTS1
WHERE
PR.WTS2 = '' AND
TF.custInclude = 'Y' and TF.WBT2 = '' AND
EM.Employee = PR.ProjMgr
)
select
EM.Employee, rtrim(EM.FirstName) + ' ' + rtrim(EM.LastName) as Name
from
EM EM
WHERE
EM.Employee IN (SELECT PR.ProjMgr
FROM
PR PR
JOIN
TabFields TF ON PR.WTS1 = TF.WTS1
WHERE
PR.WTS2 = '' AND
TF.custInclude = 'Y' and TF.WBT2 = ''
)
使用2英寸更接近原始查詢:
select EM.Employee,
rtrim(EM.FirstName) + ' ' + rtrim(EM.LastName) as Name
from EM EM
WHERE
EM.Employee IN (SELECT PR.ProjMgr
FROM
PR PR
where PR.WTS1 in (Select distinct WTS1
from TabFields
where custInclude = 'Y' and WTS2 = '')
and PR.WTS2 = ''
)
order by Name
來源
2011-06-20 18:53:09
gbn
您應該嘗試理解您之前的問題的答案並將其應用於此問題。如果你只是將論壇的答案複製粘貼到你的代碼中,而不是試圖理解,那麼你正在走向成爲代碼猴的下坡階段...... –
+ 100000000000000000 Remus指出它對**更重要了解**你在做什麼。 – JNK
這是相同的查詢,但你以前有過什麼消毒?僅供參考:http://stackoverflow.com/q/6414550/27535 – gbn