【问题标题】:Oracle - using nested table column in where clauseOracle - 在 where 子句中使用嵌套表列
【发布时间】:2017-09-14 16:40:20
【问题描述】:

我有一个暂存表 (table_B),其中的列使用嵌套表数据类型:

CREATE OR REPLACE TYPE nested_column_type AS OBJECT
          (
            abc_1            VARCHAR2(100),
            abc_2            VARCHAR2(100),
            col_id           VARCHAR2(100),
            tbl_id           NUMBER
          );

CREATE OR REPLACE TYPE nested_column_tab AS TABLE OF nested_column_type;

CREATE TABLE table_B
(col_id NUMBER,
 nested_column NESTED_COLUMN_TAB)
NESTED TABLE nested_column STORE AS column_nested);

我想在 delete 语句的 where 子句中使用 nested_column,如下所示:

DELETE FROM table_A a
WHERE tbl_id = v_tbl_id
AND NOT EXISTS (SELECT col_id 
                  FROM TABLE(SELECT b.nested_column 
                               FROM table_B b 
                              WHERE tbl_id = v_tbl_id) 
                 WHERE col_id = a.col_id);

Table_A 是我的目标表。我的目标是从 table_A 中删除记录,其中 table_A.col_id 在 table_B.nested_column.col_id 和 tbl_id = v_tbl_id 中不存在。

【问题讨论】:

  • 它并没有完全回答我的问题。我需要删除我的案例中的记录,为此我必须找到嵌套表列中不存在的所有记录。
  • SO 是一个很好的提问和获得答案的网站:请务必提供完整的MCVE。在您提出问题之前,请考虑talking to the duck first。是的,我是认真的!为了帮助我们帮助您,生成样本数据和预期结果。 ascii table 使输出易于阅读!您还可以模拟数据并尝试使用rextester.com 或类似站点的 SQL。几乎一切皆有可能;这是我们是否应该这样做的问题;我们不能。
  • @xQbert 更多细节已添加

标签: sql oracle plsql


【解决方案1】:

添加更多关于@Ted 提到的内容, 您需要了解object name resolution steps 并且必须使用表别名。这是here提到的。

为了避免内部捕获和解决引用的类似问题, Oracle 数据库要求您使用表别名来限定任何 对子程序或对象属性的点符号引用。

在您的情况下,查询变为:

DELETE FROM table_A a
      WHERE     tbl_id = v_tbl_id
            AND a.col_id NOT IN (SELECT b.col_id
                                   FROM table_B b
                                  WHERE (SELECT tb.tbl_id
                                           FROM TABLE (b.nested_column) tb) =a.tbl_id);

【讨论】:

  • 将不存在工作并且更有效率?我的研究表明这将是更好的表现。下面是我的声明在 NOT EXISTS 下的样子: ...AND NOT EXISTS (SELECT col_id FROM TABLE(SELECT b.nested_column FROM table_B b WHERE tbl_id = v_tbl_id) WHERE col_id = a.col_id)
  • 好吧,我不确定你的表中有多少数据。同样在上面的例子中,我只是展示了如何在 where 子句中使用嵌套表。如果您发现不存在的研究是有效的,那么请继续。
【解决方案2】:

我认为下面的内容会让你走上正确的道路:

select t.primary_id, nt.*
from table_b t, table (t.nested_column) nt

如有任何进一步的说明,请随时在此处再次与我联系。

泰德

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多