2015-08-13 61 views
4

我有一个交易列表,我需要检查它们是否存在于我的DEALS表中,并且对于每个现有交易,从该表中显示其属性。如何显示不存在的记录?

我使用的查询:

select * from deals 
where run_id = 2550 
and deal_id 
in ('4385601', '4385602', ...); 

不过,我也想知道哪些交易并不在该表存在。我怎样才能做到这一点?

+0

这是无数的非现有交易。你真的想让他们回来吗? – jarlh

回答

2

有一个单独的查找表中所有的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', ...) 
; 
+0

你需要另一种方式。 'lookup_table LEFT JOIN交易'。正如你现在写的,你*仍然*只得到一个交易结果行,存在于'交易'表中。 – MatBailie

+0

是的。我编辑了我的帖子。谢谢 – Madhivanan

+0

哦,'run_id = 2550'需要移动到JOIN,否则你会过滤掉所有'不存在的行'*(因为在你处于WHERE子句时run_id将为NULL )*。 – MatBailie

-1

另一种方式: -

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',...); 
+0

如果没有行,其中'RUN_ID = 2550 AND DEAL_ID ='4385601',这将不会返回一行说明它不存在。 – MatBailie

+0

是的,在这种情况下,不需要'B.RUN_ID = 2550'。但是如果OP想要输出这个特定的run_id,那么它将会很有帮助。 –

+1

使用这个例子,OP想知道如果'DEALS'表中不存在交易'4385601'。你的查询确实没有做到这一点。举一个简单的例子;具有两行值“1”和“2”的表格。然后你查询'值IN(0,1)'并将它与'NOT NOT(0,1)'值合并。第1行在列表中,因此显示为EXIST。第2行不在列表中,因此会显示为NOT EXIST。但是永远不会有结果说0值不存在。你的'NOT EXIST'测试是'表中所有不在IN子句中的行',但OP希望'IN子句中不在表中的所有值' – MatBailie

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,所以你LEFT JOIN上必须表包含潜在现有/缺失值的完整列表。