2017-09-14 16 views
1

にネストした表の列を使用して、私は、ネストした表のデータ型を使用して列を持つステージング表(table_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.col_idがtable_B.nested_column.col_idとtbl_id = v_tbl_idに存在しないtable_Aからレコードを削除することです。

+0

それはかなり私の質問に答えていません。私の場合はレコードを削除する必要があり、そのためにはネストしたテーブルの列に存在しないすべてのレコードを見つける必要があります。 – user3224907

+0

SOは質問をして答えを得る素晴らしいサイトです:完全な[MCVE](https://stackoverflow.com/help/mcve)を提供してください。質問をする前に[最初にアヒルと話をする](https://blog.codinghorror.com/rubber-duck-problem-solving/)を検討してください。そうです。私は本気です!私たちのお手伝いをするために、サンプルデータと期待される結果を生成してください。 [ascii table](https://ozh.github.io/ascii-tables/)は、出力を読みやすくします!データをモックアップすると、SQLはhttp://rextester.com/または類似のサイトを使用して試してみることもできます。かなり多くのことが可能です。それは私たちがそれをするべきかどうかの問題です。私たちはできません。 – 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 Databaseは、サブプログラムまたはオブジェクトの属性への ドット表記による参照を修飾し、テーブルの別名を使用する必要があります。あなたのケースでは

クエリは次のようになります。

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