更新选择查询的结果?

时间:2012-03-04 05:12:23

标签: sql oracle select

我正在尝试根据触发器中的select语句更新某些数据片段。 select语句如下:

SELECT col1 
FROM tbl1 d 
  LEFT OUTER JOIN tbl2 e ON D.colid = E.colid

然后,我想将从此语句返回的数据更改为在触发器中计算的新值。我认为它可能是这样的e.col1 = COUNTER,但似乎不起作用。任何帮助更新这些数据都会很棒,谢谢。

编辑:我已经更改了选择查询以检索我真正想要的数据。我上面提到的那个是错的。

UPDATE tbl2 SET col1 = COUNTER
WHERE EXISTS(SELECT col1
FROM tbl1 d 
    LEFT OUTER JOIN tbl2 e ON D.colid = E.colid 
    WHERE col2= :new.col2);

我应该再说一次,问题是当使用上面的代码时,表中的整列是更新的,而不是select查询返回的数据。

编辑: tbl1包含colid,col2和

tbl2包含colid,col1

触发器在插入tbl1之前。

4 个答案:

答案 0 :(得分:1)

一种选择是使用带有WHEN MATCHED CLAUSE的MERGE语句。这是一个很好的例子:http://www.oracle-developer.net/display.php?id=203

答案 1 :(得分:1)

如果您告诉我们触发器在哪个表上,触发器是什么类型,以及哪些列在哪个表中,这将有所帮助。我仍然无法弄清楚你要对这些更新做些什么。

UPDATE tbl2 SET col1 = COUNTER
WHERE EXISTS(SELECT col1
FROM tbl1 d 
    LEFT OUTER JOIN tbl2 e ON D.colid = E.colid 
    WHERE col2= :new.col2);

我认为问题在于你在内部select语句中执行LEFT JOIN。由于内部查询中总会有一行,并且您在EXISTS子句中执行此操作,因此它将始终匹配一行,并且您的UPDATE将触发表中的每一行。< / p>

也许这会更适合你:

UPDATE tbl2 SET col1 = COUNTER
WHERE EXISTS(SELECT col1
FROM tbl1 d 
    INNER JOIN tbl2 e ON D.colid = E.colid 
    WHERE col2= :new.col2);

我会说如果这个触发器在tbl2上,那么这是一个不好的方法,因为你可能会遇到变异表问题。

答案 2 :(得分:0)

因为您在子查询中对tbl2表进行别名,所以它将其视为与更新无关的其他表。不需要存在只需加入表格的更新,它只会更新有内连接的地方

[我的SQL Server不是oracle所以语法可能略有不同]

update tbl2  
set col1 = (COUNTER)
from tbl2 t2
where tbl2.colid = t2.colid

答案 3 :(得分:0)

我对这个问题感到有点困惑,但我这可能是你想要的:

UPDATE tbl2
SET    col1 = COUNTER
WHERE  EXISTS (
    SELECT *
    FROM   tbl1
    WHERE  tbl1.colid = tbl2.colid
    AND    tbl1.col2 = :new.col2);

Oracle还有(非标准)功能来应用UPDATE to columns of a subquery expression This pages demonstrates the feature

可以为你效劳:

UPDATE (
    SELECT tbl2.col1
    FROM   tbl2
    JOIN   tbl1 USING (colid)
    WHERE  tbl1.col2 = :new.col2
    ) t
SET  tbl2.col1 = COUNTER;