1

私はPL/SQLにかなり慣れていませんが、次のことを達成する方法があるかどうか疑問に思っていました:

   INSERT  INTO aTable (
   SELECT  FN_TO_VALUE(b.field1, b.field2, b.field3) as alias1,
           FN_TO_VALUE(b.field1, b.field2, b.field3) as alias2,
           FN_TO_VALUE(b.field1, b.field2, b.field3) as alias3,
           c.field1, c.field2
   FROM    bTable b, cTable c
   WHERE   b.alias1= c.field3
   );

FN_TO_VALUEaTableにある対応するデータ型を返す関数であるとします。

次のエラーステートメントが表示されます。

PL/SQL : SQL Statement ignored (that's located at the INSERT INTO line)
PL/SQL : ORA-00904: "B"."ALIAS1" invalid identifier

正誤表:

  • @Bob Jarvis によって提供されたソリューションの 1 つはテーブルをリンクするために必要な他のフィールドを考慮しないため、where 句をWHERE b.alias1= c.field1からWHERE b.alias1= c.field3 に変更する必要がありました。 bTable と cTable。

解決 :

  • 私は次の解決策を選択しました:

     INSERT  INTO aTable (
       SELECT b.alias1,
              b.alias2,
              b.alias3,
              c.field1,
              c.field2
       FROM cTable c, 
       (
         SELECT FN_TO_VALUE (field1, field2, field3) AS alias1,
                FN_TO_VALUE (field1, field2, field3) AS alias2,
                FN_TO_VALUE (field1, field2, field3) AS alias3
         FROM bTable 
       ) b
       WHERE b.alias1 = c.field3
    );
    
4

1 に答える 1

2
INSERT  INTO aTable (
SELECT inner.alias1,
       inner.alias2,
       inner.alias3,
       inner.field1,
       inner.field2
  FROM (SELECT FN_TO_VALUE (b.field1, b.field2, b.field3) AS alias1,
               FN_TO_VALUE (b.field1, b.field2, b.field3) AS alias2,
               FN_TO_VALUE (b.field1, b.field2, b.field3) AS alias3,
               c.field1,
               c.field2
          FROM bTable b, cTable c
         ) inner
 WHERE inner.alias1 = inner.field1
)

また

INSERT  INTO aTable (
SELECT FN_TO_VALUE (b.field1, b.field2, b.field3) AS alias1,
       FN_TO_VALUE (b.field1, b.field2, b.field3) AS alias2,
       FN_TO_VALUE (b.field1, b.field2, b.field3) AS alias3,
       c.field1,
       c.field2
  FROM bTable b, cTable c
 WHERE FN_TO_VALUE (b.field1, b.field2, b.field3) = c.field1
   );
于 2013-05-15T10:20:20.520 に答える