我有一个交易清单,我需要检查它们是否存在于我的user_id
表中,并且对于每个现有交易,从该表中显示其属性。
我使用该查询:
DEALS
但是,我也想知道该表中不存在哪些交易。我怎样才能做到这一点?
答案 0 :(得分:2)
将所有dealids放在单独的查找表中并使用此
select t2.*,
case when t1.deal_id is null then 'do not exist' else 'exists' end as status
from lookup_table as t1 left join deals as t2
on t1.deal_id=t2.deal_id
and t1.deal_id and t2.run_id = 2550
where ('4385601', '4385602', ...)
;
答案 1 :(得分:1)
简短的回答是,你不能。任何结果行都必须来自某处存在的行。
所以答案是在某个地方创建一个包含您要检查的完整列表的内容。如果你有一个真正的永久性表格列出每一个有效的交易,那么这很简单......
SELECT
all_possible_deals.deal_id
FROM
all_possible_deals
LEFT JOIN
deals
ON deals.run_id = 2550
ON deals.deal_id = all_possible_deals.deal_id
WHERE
deals.deal_id IS NULL -- This is NULL if it exists in [all_possible_deals], but not in [deals]
但是创建和/或维护这样的表可能不实际(或者甚至可能)。
在这种情况下,您可以使用内联视图而不是IN (?,?,?)
子句,并将其用作模板以进行左连接。
SELECT
all_possible_deals.deal_id
FROM
(
SELECT '4385601' AS deal_id FROM dual
UNION ALL
SELECT '4385602' AS deal_id FROM dual
UNION ALL
SELECT '4385603' AS deal_id FROM dual
)
all_possible_deals
LEFT JOIN
deals
ON deals.run_id = 2550
ON deals.deal_id = all_possible_deals.deal_id
WHERE
deals.deal_id IS NULL -- This is NULL if it exists in [all_possible_deals], but not in [deals]
这需要一些代码以编程方式生成UNION ALL
块,但它在功能上可以满足您的要求。
无论哪种方式,原则总是一样的。
您可以使用LEFT JOIN并检查未命中(NULL检查)来查找tableA中的内容但不在tableB中。
但SQL无法创建rows that are not there
,因此您左键加入的表必须包含潜在的现有/缺失值的完整列表。
答案 2 :(得分:-1)
另一种方式: -
log