我有一个交易列表,我需要检查它们是否存在于我的DEALS
表中,并且对于每个现有交易,从该表中显示其属性。如何显示不存在的记录?
我使用的查询:
select * from deals
where run_id = 2550
and deal_id
in ('4385601', '4385602', ...);
不过,我也想知道哪些交易并不在该表存在。我怎样才能做到这一点?
我有一个交易列表,我需要检查它们是否存在于我的DEALS
表中,并且对于每个现有交易,从该表中显示其属性。如何显示不存在的记录?
我使用的查询:
select * from deals
where run_id = 2550
and deal_id
in ('4385601', '4385602', ...);
不过,我也想知道哪些交易并不在该表存在。我怎样才能做到这一点?
有一个单独的查找表中所有的dealsids并使用这个
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', ...)
;
你需要另一种方式。 'lookup_table LEFT JOIN交易'。正如你现在写的,你*仍然*只得到一个交易结果行,存在于'交易'表中。 – MatBailie
是的。我编辑了我的帖子。谢谢 – Madhivanan
哦,'run_id = 2550'需要移动到JOIN,否则你会过滤掉所有'不存在的行'*(因为在你处于WHERE子句时run_id将为NULL )*。 – MatBailie
另一种方式: -
SELECT A.*,
'Exist'
FROM DEALS A
WHERE A.RUN_ID = 2550
AND A.DEAL_ID IN ('4385601', '4385602',...)
UNION
SELECT B.*,
'Not Exist'
FROM DEALS B
WHERE B.RUN_ID = 2550
AND B.DEAL_ID NOT IN ('4385601', '4385602',...);
如果没有行,其中'RUN_ID = 2550 AND DEAL_ID ='4385601',这将不会返回一行说明它不存在。 – MatBailie
是的,在这种情况下,不需要'B.RUN_ID = 2550'。但是如果OP想要输出这个特定的run_id,那么它将会很有帮助。 –
使用这个例子,OP想知道如果'DEALS'表中不存在交易'4385601'。你的查询确实没有做到这一点。举一个简单的例子;具有两行值“1”和“2”的表格。然后你查询'值IN(0,1)'并将它与'NOT NOT(0,1)'值合并。第1行在列表中,因此显示为EXIST。第2行不在列表中,因此会显示为NOT EXIST。但是永远不会有结果说0值不存在。你的'NOT EXIST'测试是'表中所有不在IN子句中的行',但OP希望'IN子句中不在表中的所有值' – MatBailie
简短的回答是,你不能。任何结果行必须来自某处存在的行。
所以,答案是创建一个有你想检查的完整列表的地方。如果你能有一个真正的永久表,列出每一个有效的交易,那么这是很简单的......
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
,所以你LEFT JOIN上必须表包含潜在现有/缺失值的完整列表。
这是无数的非现有交易。你真的想让他们回来吗? – jarlh