Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找表中不存在的值_Sql_Oracle - Fatal编程技术网

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 ;