2013-05-15 50 views
1

我是很新,PL/SQL,但我想知道是否有一种方式来实现以下目标:PL/SQL INSERT语句的子查询使用别名和功能

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_VALUE是一个函数,它返回将在aTable中的相应数据类型。

我收到以下错误语句:

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

勘误表:

  • 我不得不修改where子句从WHERE b.alias1 = c.field1其中B .alias1 = c.field3,因为@Bob Jarvis提供的解决方案之一不会考虑链接表bTable和cTable可能需要的其他字段。

SOLUTION:

  • 我都选择了以下解决方案:

    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 
    ); 
    
+3

您必须使用子选择(使该别名成为WHERE可分栏)或WHERE FN_TO_VALUE(b.field1,b.field2,b.field3)= c.field1而不是WHERE b。 alias1 = c.field1' – Najzero

回答

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 
) 

OR

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 
    ); 
+0

在第一个例子中,它看起来像WHERE子句应该从内部SELECT中移除,因为'b'仍然没有名为'alias1'的字段(就我所见这个人为的例子)。第二个看起来应该可以工作,尽管在WHERE子句中存在一个函数调用让我感到紧张。 –

+0

@BobJarvis:是的,谢谢你纠正我的第一个例子,甚至我也不会建议第二个,每行调用两次函数并不是很好的做法。 –

+0

关于第一个例子,我没有测试代码,但是在我看来,连接发生在子选择子句之后: 'inner WHERE inner.alias1 = iner.field1' 是那符合逻辑?我的意思是......我从来没有以这种方式使用过INNER,除了INNER JOINs – DFIVE

相关问题