【问题标题】:Oracle: How to find values present in an external list but not present in a column?Oracle:如何查找外部列表中存在但列中不存在的值?
【发布时间】:2010-10-26 08:10:50
【问题描述】:

我有一个包含 my_column 列的表 my_table 和一个包含 LONG 的大型列表 my_list。我想查找 my_list 中存在但 my_table.my_column 中不存在的所有值。我怎样才能用 SQL 做到这一点而不重复大量的 LONG 列表两次?由于我是 Oracle 初学者,请说明一下。谢谢。

编辑:

my_list 只是逗号分隔值(1、2、3、4)的缩写形式,它不是变量,只是一种调用方式。

【问题讨论】:

    标签: oracle select oracle10g


    【解决方案1】:

    如果您的列表是不变的,最好将其存储在参考表中并按照建议使用连接来过滤记录。

    否则,您可能会达到 2 个限制:SQL 语句的最大长度和 Oracle 在列表中允许的最大项目数。后者可以通过将大列表拆分为较小的列表来解决(my_column no in (...) 和 my_column not in (...))。

    【讨论】:

    • +1 听起来不错。谢谢。假设我只有 50 个 LONG,那么我们如何在不使用临时表的情况下处理列表?
    • 如果您的列表是常量,您可以创建一个流水线函数,返回其值可从您的 SQL 查询访问,就像它存储在表中一样
    【解决方案2】:

    也许

    select * from my_table where my_column not in (my_list)
    

    其中 my_list - 逗号分隔值列表。 你的名单有多大?

    【讨论】:

    • 抱歉,我需要在 my_list 中找到那些,而不是在 my_column 中。您需要仔细阅读。
    • 有点苛刻,越南人。除非heximal 在您发表评论后对其进行了编辑,否则它会说“不在”。另外,在一个简单的例子中责备他/她使用“select *”有点过分了。
    • 谢谢,托尼)我的意思是你所说的完全正确。但作者也是对的,我在阅读问题时应该更加小心。我会的。承诺)
    【解决方案3】:
    SELECT * FROM my_list
    EXCEPT
    SELECT * FROM my_table
    

    【讨论】:

    • 在 Oracle 中它是“MINUS”而不是“EXCEPT”,否则可以(假设 my_list 是一个表)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多