2013-02-04 67 views
1

我對這兩個查詢的結果感到驚訝。我期待着兩者都一樣。我有兩個共享公共領域的表,但是沒有建立關係。該表(A)具有字段EventID varchar(10),表(B)具有字段XXNumber varchar(15)SQL INNER JOIN與在哪裏ID IN(...)不一樣的結果

來自表BXXNumber的值在表AEventID中引用。儘管XXNumber可容納15個字符,但179K行數據中的任何一行都不超過10個字符。

所以要求是:

「以避免重複表B和表A中的條目,如果XXNumber包含在表A>‘事件ID’號碼,那麼它不應該算作」。

,看我有多少共同記錄有我第一次跑這個查詢 - 稱之爲查詢阿爾法」

SELECT dbo.TableB.XXNumber FROM dbo.TableB WHERE dbo.TableB.XXNumber in 
    (select distinct dbo.TableA.EventId FROM dbo.TableA) 

結果是5322行

下面的查詢 - 稱之爲查詢三角洲它看起來像這樣:

SELECT DISTINCT dbo.TableB.XXNumber, dbo.TableB.EventId 
FROM dbo.TableB INNER JOIN dbo.TableA ON dbo.TableB.XXNumber= dbo.TableB.EventId 

哈斯返回4308行

0123。

不應該得到的行數是否相同?

+3

第一個查詢不會'SELECT',第二個'SELECT DISTINCT'。我會假設TableB.XXNumber中有重複的值。 –

回答

6

WHERE ID IN()版本將選擇每個不同值列表中的所有匹配行(無論你的代碼DISTINCT的球鐵QT500內選擇與否 - 這是不相關)。如果一個給定的值不止一次出現在父表中,那麼您將從父表中選擇爲子表中的單個值選擇的多行。

INNER JOIN版本將從父表中爲每個成功的連接選擇一行,因此如果子表中有3行的值爲2,父表中有2行,那麼將會有6行的行該值的結果。

要使它們「相同」,請將「DISTINCT」添加到您的主要選擇中。

爲了解釋您所看到的內容,我們需要詳細瞭解您的實際數據。

+0

將DISTINCT添加到第一個查詢的主SELECT後,它可能會返回少於*行的行數,因爲第二個查詢將DISTINCT應用於不同的一組行。但這是次要的,你的主要觀點仍然存在:目前的查詢之間的差異很可能是由'dbo.TableB'中重複的'XXNumber'條目造成的。 –

+1

@AndriyM我不這麼認爲。我相信'dbo.TableB.EventId'是一個錯字,應該讀取'dbo.TableA.EventId'。因此,選擇等同條件兩側的引用,導致每行的「XXNumber」和「EventId」值相同。 –

+0

@NikolaMarkovinović:有道理,我沒有注意到,謝謝。 –