0

テーブル (ORACLE DB) から特定のレコードを削除する際に問題が発生しています。内部にネストされたテーブルがあるテーブルがあります。

テーブル構造は次のようになります: ML - ネストされたテーブル

Name, City, ML(Brand, Model, ID, Year, Price)

私がする必要があるのは、「L201」の ID を持つ特定のレコードを削除することです。

私がこれまでに試したこと:

SELECT B.ID FROM TABLE Dock A, Table(A.ML) B;

これは私にすべてのIDを与えて働いています。

出力:

ID
____
B201
S196
L201

レコードを削除しようとすると、これは機能しません:

DELETE FROM Dock
(SELECT B.ID FROM Dock A, Table(A.ML) B) C
WHERE C.ID = 'L201';

取得エラー:

行 2: SQL コマンドが正しく終了していません。

DELETE FROM TABLE
(SELECT D.ML FROM Dock D) E
WHERE E.ID = 'L201';

エラーをスローします:

単一行サブクエリは複数の行を返します

4

2 に答える 2

0

いくつかの文献を読んだ後、これを行う正しい方法を見つけたと思います。
object-type の mapping-function を定義することにより、2 つのネストされたテーブルを直接比較できます。
例:

-- creating the custom object type
create or replace type ml_type as object (
  brand varchar2(100),
  id varchar2(20),
  map member function sort_key return varchar2
);
-- creating the object type body and defining the map-function
create or replace type body ml_type as
    map member function sort_key return varchar2 is
    begin
        return self.brand || '|' || self.id;
    end;
end;
/
-- creating the nested table of custom type
create or replace type ml_tab as table of ml_type;

-- deleting from your table by comparing the nested-table elements
delete from dock where ml = (select ml from dock a, table(a.ml) b where b.id = 'L201');

この例では、 map-functions は と の連結バージョンを返すだけbrandですidが、必要/必要なものに定義できます。

于 2013-12-06T13:04:24.347 に答える