Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否正在更新select查询的结果?_Sql_Oracle_Select - Fatal编程技术网

Sql 是否正在更新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语句更新某些数据。select语句如下所示:

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。嗨,谢谢你的回复。我尝试了您所说的连接,但它没有编译,错误为无效表名。是的,对不起,我太傻了;我已添加了您要求的附加信息。