【问题标题】:Return list of supplied values that are not in table in Oracle返回不在 Oracle 表中的提供值列表
【发布时间】:2019-12-23 03:58:24
【问题描述】:

下面有一个EMPLOYEE表

EPM_ID
------
1001
1002
1004

我有一个我想要验证的 EPM_ID 列表: (1000, 1001, 1002, 1003, 1004, 1005)

如何编写 仅 Oracle SQL 查询(不创建任何临时表) 以返回不在 EMPLOYEE 表中但在我的列表中的 EPM_ID 列表?例如,结果应该是 1000、1003、1005。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    这样就可以了:

    select EPM_IDs 
    from
    (
      select 1000 as EPM_IDs union 
      select 1001 union 
      select 1002 union 
      select 1003 union 
      select 1004 union 
      select 1005
    )a
    where not exists(select 1 from EMPLOYEE e where a.EPM_IDs = e.EPM_IDs)
    

    【讨论】:

    • 但是我有一个巨大的列表,列表中大约有 50,000 个元素。那个庞大的查询会运行吗?
    • 我明白了,那个元素列表是在字符串还是表格中?你有什么形式的?
    【解决方案2】:

    您可以使用connect by子句将您的列表转换为行,然后执行MINUS操作如下:

    SQL> -- GENERATING SAME DATA AS YOUR TABLE
    SQL> WITH YOUR_DATAA (EMPLOYEE_ID) AS
      2  (SELECT '1001' FROM DUAL UNION ALL
      3  SELECT '1002' FROM DUAL UNION ALL
      4  SELECT '1004' FROM DUAL),
      5  -- YOUR QUERY STARTS FROM HERE -- WITH
      6  YOUR_LIST (LST) AS
      7  (SELECT '1000, 1001, 1002, 1003, 1004, 1005' FROM DUAL)
      8  --
      9  SELECT TRIM(REGEXP_SUBSTR(LST, '[^,]+', 1, LEVEL)) AS EMPLOYEE_IDS
     10  FROM YOUR_LIST
     11  CONNECT BY LEVEL <= REGEXP_COUNT(LST, ',') + 1
     12  MINUS
     13  SELECT EMPLOYEE_ID
     14  FROM YOUR_DATAA;
    
    EMPLOYEE_IDS
    --------------------------------------------------------------------------------
    1000
    1003
    1005
    
    SQL>
    

    干杯!!

    【讨论】:

      【解决方案3】:

      您能否告诉我们您使用的 Oracle 数据库版本以及 Employee Table 的 DESC 命令的输出?

      另外,请告诉我们您的表中的行数(即表中现有的行数)以及您尝试从中查找/未查找的员工 ID 列表的长度/大小你的桌子?

      此外,您拥有的员工 ID 列表:它们是否存储在文件、另一个表或网页等中?好心提醒。

      这将有助于进一步回答您的问题。

      问候!

      净土

      【讨论】:

        【解决方案4】:

        所以,这是拯救我的一天的解决方案。 我在生产数据库中创建临时表时受到限制,这是解决此问题的简单而明显的解决方案。

        SELECT column_value AS EMP_ID 
        FROM   TABLE(sys.Odcinumberlist(1000, 1001, 1002, 1003, 1004, 1005)) 
        MINUS 
        SELECT emp_id 
        FROM   employee 
        

        说明 : table(sys.odcinumberlist(1000, 1001, 1002, 1003, 1004, 1005)) 将提供的值转换为具有名为 EMP_ID 的单列的表状结构,如下所示。然后对其应用正常的 SQL MINUS 操作。

        EMP_ID
        ------
        1000
        1001
        1002
        1003
        1004
        1005
        

        (注意 : sys.odcinumberlist() 有最多 999 个参数的限制)

        现在不要问我 sys.odcinumberlist() 究竟在内部创建了什么。我不是数据库专业人士。请参考http://www.dba-oracle.com/t_advanced_sql_table_expressions.htm

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-06-02
          • 2023-02-02
          • 1970-01-01
          • 2020-07-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-20
          相关资源
          最近更新 更多