从 3 个内部连接中选择列 - 仍然得到笛卡尔积.S.



我有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]获得第一张唱片)

最新更新