过滤SQL连接

时间:2013-01-22 15:34:46

标签: sql tsql join

我正在尝试查询我的内部客户。我有两个表ABA存储整个月的所有销售交易数据。 B存储特定部门整个月的所有销售交易数据(格式略有不同)。

客户想要的结果是所有检查表B中的#s,表A中的任何检查#s与表B中的任何检查#s相匹配 AND 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)
    );

2 个答案:

答案 0 :(得分:4)

  

客户想要的结果都是表B中的#s,以及任何   检查表A中的#s是否与表B中的任何检查#s匹配   T_ID值为1,2或3。

left 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)

答案 1 :(得分: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在表之间提供了多对多的关系,那么您也暗示这可能无法满足您的需求。你需要以某种方式聚合关系的产物吗?