0

私は3つのテーブルを持っています。それらは内部結合されています。3つのテーブルすべてから選択すると、デカルト積が得られます。

私はdistinctを使用し、トップ1とのクロスアプライを試しました。トップ1は適切な量のレコードを返しますが、その選択されたトップNで使用されるフィールドを繰り返します。

基本的な質問。3つの異なるテーブルから選択して、デカルト結果を回避できますか?3つのテーブルすべてを結合することができ、デカルトなしで2つのテーブルからレコードを取得できます。デカルトが表示されるのは、3分の1から選択することを選択したときです。

これが可能な場合、他にどのような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
4

1 に答える 1

0

「基本的な」質問に答えるために、はい、簡単に 3 つのテーブルに参加でき、デカルト積を受け取ることはできません。ただし、適切な 1 対 1 または 1 対多の結合があることを確認する必要があります。

上記の問題は、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

フィールドが実際に結合する正しいフィールドである場合、次のように、クエリのテーブルの 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] からのみ最初のレコードを取得する)

于 2013-03-15T23:19:40.920 に答える