2012-10-17 68 views
0

爲什麼我得到這麼多的記錄數據這個加入表A,表B和表C,以獲得從表A和表C

SELECT e.OneColumn, fb.OtherColumn 
FROM dbo.TABLEA FB 
INNER JOIN dbo.TABLEB eo ON Fb.Primary = eo.foregin 
INNER JOIN dbo.TABLEC e ON eo.Primary =e.Foreign 
WHERE FB.SomeOtherColumn = 0 

當我運行此我得到數以百萬計的記錄,這是不正確的情況下,所有表的記錄數都較少。

我需要從表A和表C柱和,因爲他們沒有邏輯連接,所以我必須使用表B充當橋樑

編輯

下面是計數:

TABLEA = 273551 
TABLEB = 384412 
TABKEC = 13046 

以上查詢= 2分鐘後我強制取消了查詢..直到那個時候計數是

有什麼建議嗎?

+2

選擇看起來正確。你期望TableA和TableC之間有一對一的關係嗎? –

+0

@SebastianMeine是的。 – Zerotoinfinity

+0

您已將此更改爲非特定的,因此請檢查您的實際代碼,以查看連接中是否存在別名問題。有時候會發生這種情況,因爲你偶然在Eo.Id = EO.ID上做了一些事情,最後得到一個交叉連接。 – HLGEM

回答

1

爲了弄清楚在這樣的查詢中發生的結果與預期不符,我傾向於這樣做。首先,我改變爲一個SELECT *(注意,這只是爲了找出問題,不要在生產中使用SELECT *!)然後,如果在查詢中沒有一個,則爲tableA中的ID frield添加一個訂單。

所以,現在我運行查詢到第一個表,包括任何第一個表的條件。我註釋掉其餘的。我注意到返回的記錄數。

現在我在第二個表格中添加任何條件。如果我期待一個關係,並且如果這個查詢沒有返回記錄的數量,那麼我查看正在返回的數據,看看我能否找出原因。由於內容是通過table1 ID排序的,因此您可以通過常規方式查看一些相當容易複製的記錄的示例,然後滾動直到找到導致差異的字段。通常這意味着您需要某種附加條款或下一個表中的字段上的聚合來限制爲只有一條記錄。 JUSt在這一點上記下了這個問題,儘管你可能能夠在下次加入時更有效地進行變更。

因此,添加inteh第三個表,然後再次,而不是記錄數,然後仔細查看A的ID重複的數據。在你打算返回的列上放置一個ID,它們總是一樣嗎?如果它們不一致,那麼你就沒有一對一的關係,你需要明白,無論是數據完整性問題,還是認爲存在一對一的錯誤。如果tehy是相同的,那麼派生表可能是有序的。你只需要tableb的ID,所以加入可以看起來像這樣:

JOIN (SELECT MIn(Primary), foreign FROM TABLEB GROUP BY foreign) EO ON Fb.Primary = eo.foreign 

希望這會有所幫助。

相關問題