简体   繁体   English

从子查询更新表列

[英]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

db<>fiddle here db<> 在这里摆弄

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM