【发布时间】:2021-03-31 22:09:37
【问题描述】:
我有四列
| id | fisrt_name | last_name | city |
|---|---|---|---|
| 101 | A | B | C |
| 303 | A | B | C |
| 207 | A | B | C |
| 55 | X | Y | Z |
| 67 | X | Y | Z |
| 200 | X | Y | Z |
基本上 FN、LN 和 city 是相同的,但这些相同值的 id 不同。我想使用 oracle sql developer 将重复行的 ID 更新为相同,如下表所示。 id 可以更新为三个中的任何一个,但对于所有三个重复行,它应该变得相同。
| id | fisrt_name | last_name | city |
|---|---|---|---|
| 101 | A | B | C |
| 101 | A | B | C |
| 101 | A | B | C |
| 55 | X | Y | Z |
| 55 | X | Y | Z |
| 55 | X | Y | Z |
我试过了
UPDATE TABLE T1 SET
T1.ID = ID
WHERE ROWID IN (SELECT ROWID FROM(
SELECT ROWID,ROW_NUMBER() OVER(PARTITION BY ID, CITY ORDER BY ADR_LINE_1) AS RN, ID, CITY
FROM TABLE
WHERE (first_name,last_name,city) IN (first_name,last_name,city
from table
group by first_name,last_name,city
having count(distinct id) >= 2)) WHERE RN = 1);
它会更新所需的行,但使用相同的 id 而不是我想要的。
【问题讨论】:
-
您的查询远比它需要的复杂。您有两个(或更多?!)级别的
SELECT查询。您应该重构它以使用 CTE 和JOIN而不是拥有所有这些WHERE x IN ( SELECT ... )。 -
另外,请使用比
TABLE更好的占位符名称,因为这是 SQL 中的关键字,这使得您的查询更难阅读。 -
当然很欣赏关于那个桌子的建议,它只是参考任何桌子。但是有什么方法可以使用rownum来实现吗?
-
左对齐 SQL 实在是太难读了,也难写……
-
@jarlh 我认为这是因为没有任何缩进,而且在第 7 行的大写锁定关闭之前,一半是大写的,这使得它难以阅读。同样构造
IN (first_name,last_name,city from table没有任何意义 - 可能缺少select关键字。
标签: sql oracle sql-update