2014-06-27 111 views
1

在老試卷的一個問題如下:SQL選擇所有列從多個表

假設你有3個表(持卡人,CARDHOLDER_STATUS,帳戶)。編寫查詢以恢復數據的所有可能組合(交叉產品)。

現在我的猜測是,查詢將是這個樣子

SELECT * FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS 

將我上面的查詢返回正確的結果,還是我完全失去了?

+2

它非常正確。它會返回這些表的交叉產品。 –

回答

1

以上是正確的。 您也可以嘗試

SELECT * FROM CARDHOLDERS cross apply CARDHOLDER_STATUS cross apply ACCOUNTS 

SELECT * FROM CARDHOLDERS cross join CARDHOLDER_STATUS cross join ACCOUNTS 
+0

感謝您的幫助 – Marilee

0

是你的權利,這將產生交叉連接你。

你也可以試試這個語法相同的結果

SELECT * FROM持卡人 CROSS JOIN CARDHOLDER_STATUS CROSS JOIN帳目

+0

我認爲這個解決方案已經由azar發佈。 –

0

這個查詢確實會給予所有持卡人,每個持卡人每calhoderstatus每每一個持卡人+持卡人狀態,然後將獲取每個帳戶。
因此,如果您有2個持卡人,2個狀態和10個賬戶,查詢將返回2x2x10 = 40個結果。

通常你不希望所有的匹配記錄,但有關的記錄。
假設您已刪除一個狀態並激活一個狀態,那麼每個持卡人只有1個狀態。
目前您的查詢將返回這個(不包括所有的數據,太多類型的工作;)):

持卡人1 - 狀態刪除
持卡人1 - 狀態活躍
持卡人2 - 狀態刪除
持卡人2 - 狀態活躍

如果你現在AA statusID添加到持卡人的記錄,你可以指定一個持卡人通過編寫這樣的查詢其狀態:

SELECT * 
FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS 
WHERE CARDHOLDERS.StatusID = CARDHOLDER_STATUS.ID 



這將返回以下數據(以及可能是你所需要的):
持卡人1 - StatusID 1 - 狀態活躍
持卡人2 - StatusID 2 - 狀態刪除

0

是這是對的。然而,建議使用關鍵字CROSS JOIN而不是逗號(就像你會寫INNER JOIN,LEFT JOIN等等)來明確你正在做什麼以及你是在做什麼。

SELECT * FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS; 

這裏讀者可能會認爲你忘了WHERE子句或意外刪除它,這樣的表失去有聯接標準身不由己。

SELECT * FROM CARDHOLDERS CROSS JOIN CARDHOLDER_STATUS CROSS JOIN ACCOUNTS; 

在這裏,讀者可以確定你實際上想交叉連接表,因爲你明確地這麼說。

作爲一項規則:永遠不要通過列出逗號分隔來連接表。這是大約20年前過時的語法。總是使用顯式連接語法。它不太容易出錯並且更具可讀性。