UPDATE a SET a.sn = b.sn FROM mat_plan_ju a LEFT JOIN ( SELECT row_number() over ( ORDER BY snNumber ) sn, id FROM mat_plan_ju WHERE `year` = '2023' AND `level` = 2 ) b ON a.id = b.id WHERE a.`year` = '2023' AND a.`level` = 2 执行报错
时间: 2023-11-27 17:54:41 浏览: 44
这个 SQL 语句的语法错误可能在于:
1. MySQL 中没有 `row_number()` 函数,你可能需要使用 `@rownum` 变量来模拟行号。
2. 子查询中的 `id` 列和主查询中的 `id` 列重名了,你需要使用别名来区分它们。
3. 在 MySQL 中,UPDATE JOIN 语句中不能使用表别名来更新,需要使用表名替代别名。
参考下面修改后的 SQL 语句:
```
UPDATE mat_plan_ju a, (
SELECT @rownum:=@rownum+1 sn, id
FROM mat_plan_ju, (SELECT @rownum:=0) r
WHERE `year` = '2023' AND `level` = 2
ORDER BY snNumber
) b
SET a.sn = b.sn
WHERE a.id = b.id AND a.`year` = '2023' AND a.`level` = 2;
```
请注意,这个 SQL 语句仅供参考,具体的修改方式可能还需要根据你的表结构和数据来调整。
相关问题
UPDATE aSET a.score = b.scoreFROM aINNER JOIN b ON a.number = b.number,语句是否会改变原有a表中的其他数据
UPDATE a SET a.score = b.score FROM a INNER JOIN b ON a.number = b.number 是一条更新语句,它会根据 a 表和 b 表中的相同编号,将 a 表的 score 字段更新为 b 表中对应编号的 score 值。
这条语句只会更新 a 表中符合条件的记录,不会改变其他数据。但是需要注意的是,如果 a 表中存在符合条件的记录,但是 b 表中没有对应的记录,那么 a 表中对应的 score 字段会被更新为 NULL,这可能会影响到其他数据的查询和使用。因此,在执行更新操作时,需要仔细检查条件和数据,确保操作的正确性和安全性。
把下面的mysql语法改为oracle; update temp_asset_table a join ( select x.id,@rownum :=@rownum + 1 AS 'row_num' from ( SELECT id from temp_asset_table where BATCH_ID=batchId and ASSET_TYPE = '100' order by row_num desc ) x,(SELECT @rownum := v_max_id_100) temp ) d on a.id=d.id set a.ASSET_NUMBER= d.row_num where a.ASSET_TYPE = '100' and a.BATCH_ID=batchId;
在 Oracle 中,可以使用以下语法来执行相同的操作:
```
UPDATE (
SELECT a.ASSET_NUMBER, ROW_NUMBER() OVER (ORDER BY x.row_num DESC) AS row_num
FROM temp_asset_table a
JOIN (
SELECT id, ROW_NUMBER() OVER (ORDER BY row_num DESC) AS row_num
FROM (
SELECT id, rownum AS row_num
FROM (
SELECT id, ROWNUM AS rownum
FROM temp_asset_table
WHERE BATCH_ID = batchId AND ASSET_TYPE = '100'
ORDER BY row_num DESC
)
)
) x ON a.id = x.id
WHERE a.ASSET_TYPE = '100' AND a.BATCH_ID = batchId
) SET ASSET_NUMBER = row_num;
```
其中,使用了 `ROW_NUMBER()` 函数来生成每条记录的行号,两个子查询分别用于生成 `id` 和 `row_num`,最终通过 `JOIN` 进行匹配,并在外层使用 `SET` 子句来更新 `ASSET_NUMBER` 字段。需要注意的是,在 Oracle 中,不能在 `JOIN` 子句中使用 `@rownum` 变量。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)