我正在尝试根据触发器中的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之前。
答案 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;