[英]Updating table column from a subquery
I am trying to update a table column based off a subquery from the same table.我正在尝试根据同一表中的子查询更新表列。 The table has columns Name Id and Target Id.
该表具有列名称 Id 和目标 Id。 I am trying to take a subset of name and Id and populate column Target Id.
我正在尝试获取名称和 Id 的子集并填充列目标 Id。 For Example, I am tring to get all the id whose value is 2 and populate all the Target Id that has name XXX and YYY in this example and so
例如,我试图获取所有值为 2 的 id 并填充本示例中名称为 XXX 和 YYY 的所有目标 ID,等等
Name ID Target Id
XXX 13
XXX 29
XXX 31
YYY 17
YYY 29
YYY 38
Result trying to get:试图获得的结果:
Name ID Target Id
XXX 13 29
XXX 29 29
XXX 31 29
YYY 17 29
YYY 29 29
YYY 38 29
I have tried this statement我试过这个说法
UPDATE tableA a LEFT JOIN (SELECT name, id
FROM tableA
WHERE = '2') b
on a.Name = b.Name
SET a.Tartget_id = b.Id
I get error in Oracle using TOAD : ORA-00971: missing SET keyword我在使用 TOAD 的 Oracle 中遇到错误:ORA-00971:缺少 SET 关键字
Try below, valid syntax for SQL Server:试试下面的 SQL Server 的有效语法:
UPDATE a
SET a.Target_id = b.Id
FROM tableA a
LEFT JOIN (SELECT name, id
FROM tableA
WHERE myField = '2') b
on a.Name = b.Name
For Oracle, try:对于 Oracle,请尝试:
UPDATE (
select a.Target_Id, b.Id
from tableA a
LEFT JOIN (Select name, id from tableA WHERE myField='2') b
on a.Name=b.Name
) x
SET x.Target_Id = x.Id
Alternatively:或者:
UPDATE tableA a SET a.Target_ID = (SELECT b.Id
FROM tableA b
WHERE a.name = b.Name and myField='2')
WHERE EXISTS (SELECT a2.CODE
FROM tableA a2
WHERE a1.name = a2.name);
Reference: Update statement with inner join on Oracle参考: 在 Oracle 上使用内连接更新语句
Use a MERGE
statement.使用
MERGE
语句。
Oracle Setup :甲骨文设置:
CREATE TABLE TableA (
Name VARCHAR2(3),
ID NUMBER,
Target_Id NUMBER
);
INSERT INTO TableA ( Name, Id )
SELECT 'XXX', 13 FROM DUAL UNION ALL
SELECT 'XXX', 29 FROM DUAL UNION ALL
SELECT 'XXX', 31 FROM DUAL UNION ALL
SELECT 'YYY', 17 FROM DUAL UNION ALL
SELECT 'YYY', 29 FROM DUAL UNION ALL
SELECT 'YYY', 38 FROM DUAL;
Merge :合并:
MERGE INTO tableA dst
USING tableA src
ON ( dst.Name = src.Name )
WHEN MATCHED THEN
UPDATE SET Target_id = src.Id
WHERE src.id = 29;
Output :输出:
SELECT * FROM tableA
\nNAME |姓名 | ID |
身份证 | TARGET_ID
TARGET_ID\n:--- |
:--- | -: |
-: | --------:
--------:\nXXX |
XXX | 13 |
13 | 29
29\nXXX |
XXX | 29 |
29 | 29
29\nXXX |
XXX | 31 |
31 | 29
29\nYYY |
年年 | 17 |
17 | 29
29\nYYY |
年年 | 29 |
29 | 29
29\nYYY |
年年 | 38 |
38 | 29
29\n
Or, if you are trying to update rows where there are duplicate IDs:或者,如果您尝试更新存在重复 ID 的行:
MERGE INTO tableA dst
USING (
SELECT t.*,
COUNT(*) OVER ( PARTITION BY id ) AS count_ids
FROM tableA t
) src
ON ( dst.Name = src.Name AND count_ids = 2 )
WHEN MATCHED THEN
UPDATE SET Target_id = src.Id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.