2010-12-09 104 views
1

爲什麼這兩個SQL結構不會產生相同的結果,我有點難以理解。sql join -vs- where子句不會產生相同的結果?

SQL#1回2條相同的記錄(DUP的)當只有一個缺陷表中存在...看下SQL

SELECT * 
FROM Defects d 
    JOIN StatusCode C ON C.CodeName = d.Status AND c.scid = 10 
WHERE d.AssignedTo='me' 

SQL#2重播1個紀錄 - 這是在原始數據的正確原因lookign有一個缺陷不是封閉的「我」

SELECT * 
FROM Defects d 
WHERE d.AssignedTo='me' AND Status <> 'closed' 

所有我做的是不是使用負,其中狀態沒有的東西,用積極的方式加入到具有其他每個值的缺陷狀態記錄比已關閉

爲什麼會發生這種情況,以及如何通過連接來改變我的選擇,以便對其結果進行驗證。我試圖使用DISTINCT但它失敗:

ntext數據類型不能被選擇作爲 DISTINCT,因爲它不是 可比性。

沒有狀態碼被「封閉」,沒有一個:

select * from StatusCode where scid = 10 

導致這些值: 固定 新 準備複試 失敗複試 質量跟進 重新打開 拒絕 消費者 編碼 打開 固定 新 準備複試 失敗複試 質量跟進 重新打開 拒絕 消費者 編碼 打開

+1

我看到你的數據庫中有ntext字段。您需要開始使用nvarchar(max)替換這些,因爲ntext已被棄用,並且不會在2008年後的SQL Server的下一個版本中。使用IN的 – HLGEM 2010-12-09 16:09:29

回答

1

內部聯接將返回行的所有匹配的組合,所以必須有行中的StatusCode表匹配您的缺陷的「狀態」值(並SCID = 10)。

固定

準備複試
失敗複試
質量跟進
重新打開
拒絕消費者
編碼
打開
固定

準備複試
失敗複試
質量跟進
重新打開
拒絕消費者
在編碼
打開

不知道我是否解析了你的列表完全正確,但似乎有重複。那麼,答案是消除StatusCode表中的重複項,或者如果重複項有效,則應用額外的過濾器來區分它們。

1

多少行是通過這種退換嗎?

SELECT * FROM StatusCode C WHERE c.scid = 10 

因此,您可能要做到這一點:

SELECT * 
FROM Defects d 
WHERE d.AssignedTo='me' AND d.Status IN (
    SELECT C.CodeName FROM StatusCode C WHERE C.scid = 10 
) 

編輯解決您的編輯:因爲你有多個狀態與scid=10,每個那些將被連接到您的行,這是你爲什麼得到重複。我的代碼建議仍然有效。

+0

與執行連接以消除不需要的記錄相同,對吧?也就是說你可以使用IN('Fixed','New','Ready for Retest'....)來獲得排除狀態<>關閉的缺陷的結果AKA,其中狀態=關閉以外的所有選項。以及加入到同一組來排除。 – kacalapy 2010-12-09 16:03:29

+0

'JOIN`會創建所有匹配的組合,這不是你想要的。另一方面`IN`與另一個`WHERE`謂詞相同,如果指定的值包含在`IN()`集合中,則返回true。 – Lucero 2010-12-09 16:07:33

-2

我認爲這個問題是在這裏:

JOIN StatusCode C ON C.CodeName = d.Status AND c.scid = 10 

的c.scid = 10應在where子句。

+1

作爲一個連接條件,這是非常有效的,因爲它是一個內部連接,這意味着不滿足的條件將跳過該行,這是(在這種情況下)與在`WHERE`子句中的相同。 – Lucero 2010-12-09 16:00:03