2017-09-14 81 views
1

我有一個臨時表(表-B)使用嵌套表數據類型的列嵌套表列:甲骨文 - 使用在where子句

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中。

+0

這並不完全回答我的問題。我需要刪除我的案例中的記錄,爲此,我必須找到嵌套表格列中不存在的所有記錄。 – user3224907

+0

SO是一個很好的網站,可以提出問題並獲得答案:請確保提供完整的[MCVE](https://stackoverflow.com/help/mcve)。在提出問題之前,請考慮[先與鴨子交談](https://blog.codinghorror.com/rubber-duck-problem-solving/)。是的,我很認真!爲了幫助我們幫助您,請生成樣本數據和預期結果。 [ascii表](https://ozh.github.io/ascii-tables/)使輸出易於閱讀!您還可以模擬數據,並使用http://rextester.com/或類似網站嘗試SQL。幾乎任何事情都是可能的;這是我們應該做的事情;我們不是。 – xQbert

+0

@xQbert更多詳細信息已添加 – user3224907

回答

1

我認爲下面將讓你在正確的道路:

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

對於任何進一步的說明,請不要猶豫,我在這裏再次聯繫。

特德

1

添加更多的@Ted提到什麼, 您需要了解object name resolution步驟,必須使用一個表的別名。這被提到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); 
+0

不會存在的工作,並更有效率?我的研究表明它會有更好的表現。這裏是我的語句與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)' – user3224907

+0

不知道是不確定你的表中有多少數據。在上面的例子中,我剛剛展示瞭如何在where子句中使用嵌套表。如果你發現你的研究不存在是高性能的,那麼繼續。 – XING