我有3张桌子。它们是内部连接的。当我选择从所有三个表中进行选择时,我得到一个笛卡尔乘积。
我使用了不同的,并且尝试过与前 1 名交叉应用。Top 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
要回答您的"基本"问题,是的,您可以轻松地连接 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]获得第一张唱片)