【问题标题】:Get values from a table which are not present only in the 'IN' clause从表中获取不仅存在于“IN”子句中的值
【发布时间】:2014-06-28 15:16:10
【问题描述】:

我想通过仅考虑 IN 子句中的值来获取表中不存在的值。

例如,

select orderNumber from order where orderNumber in (List of orderNumbers)

这将通过考虑 IN 子句中存在的值来给出表中存在的 orderNumbers,同样我希望通过考虑 IN 子句中存在的值来获得表中不存在的 orderNumbers。

是否存在任何查询逻辑来处理这种情况?

【问题讨论】:

  • 你有另一个表来反弹值吗?如果是这样,假设我们将其称为 table2,您可以使用 SELECT orderNumber from table2 where orderNumber NOT IN (select orderNumber from table1 where orderNumber IN (list of orderNumbers))...这是假设您有另一个包含所有 orderNumbers 的表
  • 如果您要查找属于 IN 子句的值以及不属于 IN 子句的值,则不需要 IN 子句。 SELECT ORDERNUMBER FROM ORDER 应该完成这项工作。分享和享受。

标签: mysql sql oracle plsql


【解决方案1】:

您需要使用left outer joinwhere 子句进行连接:

select on.*
from (select 1 as OrderNumber from dual union all
      select 2 from dual
      . . .
      select n from dual
     ) ordn left outer join
     orders o
     on o.ordernumber = ordn.ordernumber
where o.ordernumber is NULL;

【讨论】:

  • NOT IN 运算符不是提取所需结果集的更简单方法吗?
  • @PrahaladDeshpande 。 . .根据 OP 的要求,这将是一种更简单的方法来获得错误的结果。 OP 正在请求列表中不在表中的元素(不是表)。
  • 好的..我明白了...感谢您的澄清:)
  • 嗨,戈登,我尝试了您在 oracle 和 DB2 中建议的相同查询。我正在使用 Spring Batch,它将执行数千条记录。如果我在双表中使用大量记录,则在 oracle 中无法正确检索记录。同样在 DB2 中,它会显示错误的 sql 语法错误
  • @Analysts 。 . .在 db2 中,您必须使用 sysdummy1 而不是 dual。在 MySQL 中,您将完全省略 from 子句。
【解决方案2】:

我认为您正在寻找的是 MINUS 关键字。虽然没有IN 子句,但您应该能够使其适用于您的用例。

这给出了in_clause_table 中所有不在order 中的订单号。

SELECT ordernumbers FROM in_clause_table
MINUS
SELECT orderNumber FROM order;

注意:顺便说一句,有很多方法可以实现这一点,但我认为这可能是最简洁的一种。

【讨论】:

    【解决方案3】:

    不重复 IN 子句的一种方法是使用子查询因式分解子句:

    WITH Q1 AS
      (SELECT ORDERNUMBER
         FROM ORDERS
         WHERE ORDERNUMBER IN (1, 2, 3, 4))
    SELECT q.ORDERNUMBER AS INCLUDED_ORDERNUMBER,
           NULL          AS EXCLUDED_ORDERNUMBER
      FROM Q1 q
      UNION ALL
      SELECT NULL          AS INCLUDED_ORDERNUMBER,
             o.ORDERNUMBER AS EXCLUDED_ORDERNUMBER
        FROM ORDERS o
        WHERE o.ORDERNUMBER NOT IN (SELECT ORDERNUMBER FROM Q1);
    

    分享和享受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多