我正在尝试查询我的内部客户。我有两个表A
和B
。 A
存储整个月的所有销售交易数据。 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)
);
答案 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在表之间提供了多对多的关系,那么您也暗示这可能无法满足您的需求。你需要以某种方式聚合关系的产物吗?