0

我正在尝试查询我的内部客户。我有两张桌子AB. A存储一整月的所有销售交易数据。B存储特定部门整月的所有销售交易数据(形式略有不同)。

客户想要的结果是表 B 中的所有检查 #,加上表 A 中表 B中的任何检查 # 匹配且T_ID值为 的任何检查 # 1, 2, or 3

注意:在 A 和 B 中,检查 # 可以有多个条目。

认为我的查询是正确的(??),但客户告诉我它“看起来不正确”(具体来说,他是说我们从表 A 中提取了太多记录)。

我对我的 SQL 没有足够的信心来反驳他(并且这个查询返回了几千行),所以我想知道是否有人可以给下面的查询一次,让我知道我哪里出错了?

这是在 MS SQL Server 2000 上运行的。

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 中的所有检查 #,加上表 A 中与表 B 中的任何检查 # 匹配且 T_ID 值为 1、2 或 3 的任何检查 #。

Aleft join似乎符合要求,表 B 为左侧:

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 回答