在老試卷的一個問題如下:SQL選擇所有列從多個表
假設你有3個表(持卡人,CARDHOLDER_STATUS,帳戶)。編寫查詢以恢復數據的所有可能組合(交叉產品)。
現在我的猜測是,查詢將是這個樣子
SELECT * FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS
將我上面的查詢返回正確的結果,還是我完全失去了?
在老試卷的一個問題如下:SQL選擇所有列從多個表
假設你有3個表(持卡人,CARDHOLDER_STATUS,帳戶)。編寫查詢以恢復數據的所有可能組合(交叉產品)。
現在我的猜測是,查詢將是這個樣子
SELECT * FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS
將我上面的查詢返回正確的結果,還是我完全失去了?
以上是正確的。 您也可以嘗試
SELECT * FROM CARDHOLDERS cross apply CARDHOLDER_STATUS cross apply ACCOUNTS
或
SELECT * FROM CARDHOLDERS cross join CARDHOLDER_STATUS cross join ACCOUNTS
感謝您的幫助 – Marilee
是你的權利,這將產生交叉連接你。
你也可以試試這個語法相同的結果
SELECT * FROM持卡人 CROSS JOIN CARDHOLDER_STATUS CROSS JOIN帳目
我認爲這個解決方案已經由azar發佈。 –
這個查詢確實會給予所有持卡人,每個持卡人每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 - 狀態刪除
是這是對的。然而,建議使用關鍵字CROSS JOIN而不是逗號(就像你會寫INNER JOIN,LEFT JOIN等等)來明確你正在做什麼以及你是在做什麼。
SELECT * FROM CARDHOLDERS, CARDHOLDER_STATUS, ACCOUNTS;
這裏讀者可能會認爲你忘了WHERE子句或意外刪除它,這樣的表失去有聯接標準身不由己。
SELECT * FROM CARDHOLDERS CROSS JOIN CARDHOLDER_STATUS CROSS JOIN ACCOUNTS;
在這裏,讀者可以確定你實際上想交叉連接表,因爲你明確地這麼說。
作爲一項規則:永遠不要通過列出逗號分隔來連接表。這是大約20年前過時的語法。總是使用顯式連接語法。它不太容易出錯並且更具可讀性。
它非常正確。它會返回這些表的交叉產品。 –