2013-01-31 198 views
1

我有兩個表,我試圖通過一個字段進行聯接,並且它在兩個查詢中給出了不同的結果,這些結果應該會給出相同的結果。查詢是:具有不同結果的SQL查詢

SELECT * FROM tblCustomer tca 
WHERE tca.PhoneNumber IN(
    SELECT ts.SubscriptionNumber FROM sub.tblSubscription ts 
    WHERE ts.ServiceTypeID=4 
    AND ts.SourceID=-1 
) 

SELECT tca.* 
FROM sub.tblSubscription ts 
     inner JOIN tblCustomer tca 
      ON ts.SubscriptionNumber = tca.PhoneNumber 
WHERE ts.ServiceTypeID = 4 
     AND ts.SourceID = -1 

這怎麼可能?

+0

有什麼區別?關係是一對一還是另一個? –

+0

你能告訴我們數據和表格定義嗎? – SQLGuru

+1

'IN'是一個半連接,由於'1..n'關係不會帶來重複。它比內部加入更有效,然後用'DISTINCT'刪除重複項。 –

回答

3

我假設客戶可以有多個訂閱,對不對?我們假設您有5個客戶,每個客戶有2個訂閱...

當執行SELECT ... FROM Customer WHERE IN(訂閱)時,您將收到5個客戶記錄,因爲這5個客戶中的每一個實際上都在訂閱表,即使訂閱表將有10條記錄。您本質上要求數據庫從一個表中獲取數據,其中一個字段的值存在於另一個表中。所以它只會返回FROM表中的不同記錄,而不管WHERE IN表中的數據量。

另一方面,INNER JOIN的客戶表與訂閱表將返回5客戶x 2訂閱每個= 10條記錄。通過加入表格,您要求數據庫查找每個表格中的所有數據,其中數據與特定字段進行匹配。

所以是的,這2個查詢肯定會給你不同的結果。

+0

它是訂閱(1)與客戶(很多)的關係,所以它應該給出相同的結果 – stanke

+0

@stanke - 所以提供一個repro向我們展示不同的結果。 –

+0

@MartinSmith我發現內連接是重複的結果,正如你所說的,所以當我在查詢中使用內連接進行'獨特'時,它給了我與'where ... in'查詢中相同的結果。非常感謝! – stanke