如何显示不存在的记录?

时间:2015-08-13 09:19:23

标签: sql oracle

我有一个交易清单,我需要检查它们是否存在于我的user_id表中,并且对于每个现有交易,从该表中显示其属性。

我使用该查询:

DEALS

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

3 个答案:

答案 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