Sql 查找表中不存在的值
假设我有一张桌子:Sql 查找表中不存在的值,sql,oracle,Sql,Oracle,假设我有一张桌子: ID ACCNT DESC 1 123 aaa 2 234 bbb 3 345 ccc 我有一个账号列表123345555777。 这样我就可以得到一个 SELECT * FROM MY_TABLE WHERE ACCNT IN (...my list...) 现在我想实现相反的目标。 从我的列表中,我需要一个查询来显示表中没有的帐号 因此,在我的示例中,我想报告表中不存在555和77 如何在Oracle SQL中编写此查
ID ACCNT DESC
1 123 aaa
2 234 bbb
3 345 ccc
我有一个账号列表123345555777。这样我就可以得到一个
SELECT * FROM MY_TABLE WHERE ACCNT IN (...my list...)
现在我想实现相反的目标。从我的列表中,我需要一个查询来显示表中没有的帐号 因此,在我的示例中,我想报告表中不存在555和77
如何在Oracle SQL中编写此查询?以下方法可能适用于Oracle。您可以使用
UNION
创建子查询,该子查询只有一列包含您的帐户ID列表。然后您可以将其左连接到您的表中,并隔离与我的表中的任何内容不匹配的ID
SELECT t1.ACCNT
FROM
(
SELECT 123 AS ACCNT FROM DUAL
UNION ALL
SELECT 345 FROM DUAL
UNION ALL
SELECT 555 FROM DUAL
UNION ALL
SELECT 777 FROM DUAL
) t1
LEFT JOIN MY_TABLE t2
ON t1.ACCNT = t2.ACCNT
WHERE t2.ACCNT IS NULL
这种方法的一个优点是,它实际上不会创建一个查询后可能不需要的表。这里有一种方法。您只需创建架构级集合(嵌套表)并使用右/左外部联接:
-- our collection type
create type t_list as table of number;
/
-- sample of data from your question
with t1(id1, accnt, desc1) as(
select 1, 123, 'aaa' from dual union all
select 2, 234, 'bbb' from dual union all
select 3, 345, 'ccc' from dual
)
-- query itself
select t2.column_value as missing_num
from t1 <-- here goes your table
right join table(t_list(123,345,555,777)) t2
on (t2.column_value = t1.accnt)
where t1.accnt is null
这取决于您的帐号列表的来源。例如,可以使用集合类型和表运算符:
-- Test case setup
CREATE TABLE ACCNT(ID,ACCNT,DESCR) AS
SELECT 1,123, 'aaa' FROM DUAL UNION ALL
SELECT 2,234, 'bbb' FROM DUAL UNION ALL
SELECT 3,345, 'ccc' FROM DUAL;
-- Create a collection type to hold account numbers
CREATE TYPE tab_numbers AS TABLE OF NUMBER;
/
-- Select account numbers that does not occur on the table
SELECT *
FROM TABLE(TAB_NUMBERS(123,345,555,777))
WHERE COLUMN_VALUE NOT IN (SELECT ACCNT FROM ACCNT);
您可以在不存在的地方使用,示例如下
SELECT *
FROM MY_TABLE MT
WHERE NOT EXISTS (SELECT * FROM AccountNumbers AN WHERE MT.accountID = AN.id)
一种方法是使用unpivot函数:
select Number as ACCNT from(
select * from (
select 123,345,555,777 from dual )
unpivot
(
"Values" FOR "Number" IN ("123","235","555","777")
)
)
minus
select ACCNT from my_table ;
输出应该是列表中留下的帐号。此列表是否存在于表中?我想,您有另一个表或列表用于帐号。分享它,否则就不可能显示。你的号码列表来自哪里?我得到了一个id列表。它们不存在于表中。我需要报告列表中不存在的id。我认为您需要一个表、一个临时表或一些动态SQL来获得所需的结果。
SELECT *
FROM MY_TABLE MT
WHERE NOT EXISTS (SELECT * FROM AccountNumbers AN WHERE MT.accountID = AN.id)
select Number as ACCNT from(
select * from (
select 123,345,555,777 from dual )
unpivot
(
"Values" FOR "Number" IN ("123","235","555","777")
)
)
minus
select ACCNT from my_table ;