Sql 是否正在更新select查询的结果?
我试图根据触发器中的select语句更新某些数据。select语句如下所示:Sql 是否正在更新select查询的结果?,sql,oracle,select,Sql,Oracle,Select,我试图根据触发器中的select语句更新某些数据。select语句如下所示: SELECT col1 FROM tbl1 d LEFT OUTER JOIN tbl2 e ON D.colid = E.colid 然后,我想将此语句返回的数据更改为触发器中计算的新值。我想可能是这样的e.col1=COUNTER,但这似乎不起作用。任何关于更新这些数据的帮助都将非常好,谢谢 编辑:我更改了select查询以检索实际需要的数据。我上面说的那个是错误的 UPDATE tbl2 SET col
SELECT col1
FROM tbl1 d
LEFT OUTER JOIN tbl2 e ON D.colid = E.colid
然后,我想将此语句返回的数据更改为触发器中计算的新值。我想可能是这样的e.col1=COUNTER
,但这似乎不起作用。任何关于更新这些数据的帮助都将非常好,谢谢
编辑:我更改了select查询以检索实际需要的数据。我上面说的那个是错误的
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和col列
tbl2包含列colid和col1
触发器在tbl1上的insert之前。一个选项是使用带有WHEN MATCHED子句的MERGE语句。这里有一个很好的例子:因为您在子查询中使用了tbl2表的别名,所以它将其视为与更新无关的另一个表。无需执行exists操作,只需将更新连接到表中,它只会在存在内部连接的情况下进行更新 [我的SQL Server不是oracle,因此语法可能略有不同]
update tbl2
set col1 = (COUNTER)
from tbl2 t2
where tbl2.colid = t2.colid
如果您告诉我们触发器在哪个表上,什么类型的触发器,以及哪个表中有哪些列,这会有所帮助。我还是不太明白你想用这些更新做什么
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语句中执行左连接。由于内部查询中始终有一行,并且您在EXISTS
子句中执行此操作,因此它将始终匹配一行,并且您的更新将触发表中的每一行
也许这对你来说会更好:
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上,那么这是一种不好的做法,因为您可能会遇到变异表问题。我对这个问题有点困惑,但我想这可能是您想要的:
UPDATE tbl2
SET col1 = COUNTER
WHERE EXISTS (
SELECT *
FROM tbl1
WHERE tbl1.colid = tbl2.colid
AND tbl1.col2 = :new.col2);
Oracle还有一个(非标准)功能,可以应用。
可以为您工作:
UPDATE (
SELECT tbl2.col1
FROM tbl2
JOIN tbl1 USING (colid)
WHERE tbl1.col2 = :new.col2
) t
SET tbl2.col1 = COUNTER;
定义:某些数据段
。澄清:要将返回的数据全部更改为触发器中计算的新值。
某些数据-select查询的一列。我的意思是我想将查询中的某些数据更改为我以前计算过的值。我已经更改了我需要查询执行的操作,我相信我必须使用select now,因为我有where语句,它引用了属于tbl1的col2。嗨,谢谢你的回复。我尝试了您所说的连接,但它没有编译,错误为无效表名。是的,对不起,我太傻了;我已添加了您要求的附加信息。