0

社内の顧客に問い合わせようとしています。私は2つのテーブルAとを持っていBます。 A1か月間のすべての販売取引データを保存します。B特定の部門の1か月間のすべての販売取引データを(わずかに異なる形式で)保存します。

顧客が望む結果は、テーブルBのすべてのチェック番号に加えて、テーブルBのチェック番号のいずれかに一致しT_ID値が。のテーブルAのチェック番号です1, 2, or 3

注:AとBの両方で、チェック番号に複数のエントリを含めることができます。

クエリは正しいと思いますが(??)、顧客から「正しくない」と言われています(具体的には、表Aから取得しているレコードが多すぎるとのことです)。

私は自分のSQLに彼に異議を唱えるのに十分な自信がありません(そしてこのクエリは数千行を返します)ので、誰かがもう一度以下のクエリを与えて、どこが間違っているのか教えてくれないかと思っていましたか?

これはMSSQLServer2000で実行されます。

SELECT  
        A.T_ID, 
        A.check_number,
        A.check_type_id,
        A.cashier_id,
        A.terminal_id,
        A.first_tender,
        A.tendered_date_time,
        A.tender_amount,
        A.change_amount,
        A.net_tender_amount,
        A.currency_received,
        B.account_name,
        B.account_number
FROM tCTD AS A
INNER JOIN tGAAAD AS B
        ON A.check_number = B.check_number
WHERE EXISTS 
    (   SELECT * 
        FROM tCTD 
        WHERE check_number = A.check_number 
        AND T_ID IN (1, 2, 3)
    );
4

2 に答える 2

4

顧客が望む結果は、テーブルBのすべてのチェック番号に加えて、テーブルBのチェック番号のいずれかに一致し、T_ID値が1、2、または3であるテーブルAのチェック番号です。

left join表Bを左側にして、Aは法案に適合しているようです。

FROM tGAAAD AS B
LEFT JOIN tCTD AS A
ON A.check_number = B.check_number
   AND T_ID in (1,2,3)
于 2013-01-22T15:37:59.523 に答える
1

あなたが持っているものは、より単純なものと同等です

SELECT  
        A.T_ID, 
        A.check_number,
        A.check_type_id,
        A.cashier_id,
        A.terminal_id,
        A.first_tender,
        A.tendered_date_time,
        A.tender_amount,
        A.change_amount,
        A.net_tender_amount,
        A.currency_received,
        B.account_name,
        B.account_number
     FROM 
             tCTD A
         INNER JOIN 
             tGAAAD B
                 ON A.check_number = B.check_number
    WHERE 
             A.T_ID IN (1, 2, 3);

あなたの説明から、それはあなたが実際に望んでいるように聞こえます

SELECT  
        A.T_ID, 
        A.check_number,
        A.check_type_id,
        A.cashier_id,
        A.terminal_id,
        A.first_tender,
        A.tendered_date_time,
        A.tender_amount,
        A.change_amount,
        A.net_tender_amount,
        A.currency_received,
        B.account_name,
        B.account_number
     FROM 
             tGAAAD B
         LEFT JOIN 
             tCTD A
                 ON A.check_number = B.check_number
    WHERE 
             ISNULL(A.T_ID, 1) IN (1, 2, 3);

ただし、check_numberがテーブル間に多対多の関係を提供する場合は、これも必要なものを提供しない可能性があることを意味します。何らかの方法で関係の積を集約する必要がありますか?

于 2013-01-22T15:42:06.757 に答える