2012-11-15 33 views
0

我有3張桌子。他們內在聯繫在一起。當我選擇從所有三張桌子中選擇時,我得到一個笛卡爾產品。從3個內連接中選擇列 - 仍然獲得笛卡爾產品。 S

我用不同的,我已經試過交叉與頂級1.上1適用帶回的記錄適量,但它重複在使用的字段選擇頂部N.

基本問題。你可以從3個不同的表中選擇並避免笛卡爾結果?我可以將所有三張表連接起來,並且不同的是我可以從沒有笛卡爾的兩張表中獲得記錄。當我選擇從三分之一選擇笛卡爾出現的地方時。

如果這是可能的,我應該試驗哪些其他tsql命令/構造? http://imageshack.us/f/255/50353790.png/

SELECT CRT.[TransactionID] 
     ,CRT.[creditrewardsID] 
     ,CRT.[OwnerID] 
     , CRT.[TransactionDate] 
     ,CRT.[ItemID] 
     ,CRT.[VALUE] 
     ,CRM.First 
     ,CRM.MI 
     ,CRM.Last 
     ,CTI.fn 
     ,CTI.ln 
    FROM [ownership].[dbo].[creditrewardsTransactions] CRT 
    Join [ownership].[dbo].[creditrewardsMembers] CRM 
    on CRT.creditrewardsid = CRM.[creditrewardsID] 
    Join [Exchange].[dbo].[CreditTourInfo] CTI 
    on CRM.CRMemberNum = CTI.PRIMECRPNum 
--where CRT.creditrewardsID = 11111 
+6

您可以**請**向我們展示您正在使用的實際**查詢**(T-SQL代碼)?是的 - 使用適當的JOIN和正確的連接條件,你可以**絕對**從三個連接的表中選擇**而不需要**笛卡爾產品... –

+0

YES ...現在就可以了。 – user1826685

+0

您還可以提供一些示例數據和輸出嗎?如果你使用上面的查詢,那麼你沒有得到笛卡兒,你會得到預期的結果(假設你的連接條件是正確的)。爲了獲得更多幫助,我們需要查看數據.. – StevieG

回答

0

要回答你的「基本」的問題,是你可以很容易地加入3個表和未收到笛卡爾乘積。但是,您需要確保您擁有正確的一對一或一對多連接。

上面的問題可能與您在creditrewardsMembers和CreditTourInfo表中的數據有關。加入CRMemberNum和PRIMECRPNum字段可能是多對多連接,它將爲您提供笛卡爾產品。

您可以運行這些SQL語句來確認。如果他們都返回記錄,那麼你有一個多對多連接問題。

SELECT CRM.CRMemberNum, COUNT(*) 
    FROM [ownership].[dbo].[creditrewardsMembers] CRM 
GROUP BY CRM.CRMemberNum 
HAVING COUNT(*) > 1 

SELECT CTI.PRIMECRPNum, COUNT(*) 
    FROM [Exchange].[dbo].[CreditTourInfo] CTI 
GROUP BY CTI.PRIMECRPNum 
HAVING COUNT(*) > 1 

如果字段其實正確的人加入,那麼你可能需要只挑選的第一個記錄在您的查詢像這樣的一個表。

SELECT CRT.[TransactionID] 
     ,CRT.[creditrewardsID] 
     ,CRT.[OwnerID] 
     ,CRT.[TransactionDate] 
     ,CRT.[ItemID] 
     ,CRT.[VALUE] 
     ,CRM.First 
     ,CRM.MI 
     ,CRM.Last 
     ,CTI.fn 
     ,CTI.ln 
    FROM [ownership].[dbo].[creditrewardsTransactions] CRT 
    JOIN [ownership].[dbo].[creditrewardsMembers] CRM 
    ON CRT.creditrewardsid = CRM.[creditrewardsID] 
    JOIN (
     SELECT PRIMECRPNum, MIN(fn) as [fn], MIN(ln) as [ln] 
      FROM [Exchange].[dbo].[CreditTourInfo] 
     GROUP BY PRIMECRPNum 
     ) CTI 
    ON CRM.CRMemberNum = CTI.PRIMECRPNum 

最終,它將取決於您的特定數據模型的侷限性以及您可能需要做出的折衷。 (即獲得僅來自[CreditTourInfo]的第一條記錄)