如果行不是重复的,或者行的 ID 不是 SQL SSMS 中的某个数字,则更新列

Posted

技术标签:

【中文标题】如果行不是重复的,或者行的 ID 不是 SQL SSMS 中的某个数字,则更新列【英文标题】:Update a column if a row is not a duplicate, or a row's ID isn't a certain number in SQL SSMS 【发布时间】:2022-01-24 00:14:21 【问题描述】:

我有一张表,我希望使用以下更新命令将isExcluded = 1 设置为PhoneIDPhoneName 不重复的所有行以及ID 没有最小的所有行如果这些行没有重复的PhoneIDPhoneName,则来自选定PhoneID 的编号(即:由于所有带有PhoneID = 2 的行都不重复,因此包含PhoneName = b 的行具有最小的ID,因为它是@ 987654332@。因此,所有带有PhoneID = 2ID > 3 的行都将其IsExcluded 设置为1

ID PhoneID PhoneName isExcluded
1 1 a 0
2 1 a 0
3 2 b 0
4 2 c 0
5 2 d 0
6 2 e 0
7 3 c 0
8 3 c 0
9 3 d 0
10 3 d 0

这是我编写的 SQL 脚本。它似乎只得到非重复项。

WITH Duplicates AS
(
    SELECT
        ID, PhoneID, PhoneName, isExcluded,
        (ROW_NUMBER() OVER (PARTITION BY PhoneName, PhoneID ORDER BY ID)) AS RowNum
    FROM
        Phones
)
UPDATE Phones
SET isExcluded = 1
FROM Duplicates d
WHERE (
d.PhoneID = Phones.PhoneID     
AND d.PhoneName = Phones.PhoneName 
AND d.RowNum =< 1);

SELECT * FROM Phones;

这个表应该是我的命令的结果。

ID PhoneID PhoneName isExcluded
1 1 a 0
2 1 a 0
3 2 b 0
4 2 c 1
5 2 d 1
6 2 e 1
7 3 c 0
8 3 c 0
9 3 d 1
10 3 d 1

【问题讨论】:

【参考方案1】:

这看起来是间隙和孤岛问题的变体,您可以通过首先对分区进行分组然后使用可更新的 CTE 分配 isExcluded 值来解决该问题

with gp as (
    select *, 
      Row_Number() over(order by id) 
      - Row_Number() over(partition by phoneid, phonename order by id) gp
    from t
), p as (
    select *, 
      case when Min(gp) over(partition by phoneid) <gp then 1 end IsEx
    from gp
)
update p set isExcluded = isEx
where IsEx = 1

见working DB<>Fiddle

【讨论】:

工作正常!如果将列的 isExcluded 设置为 1,而将 PhoneID 设置为等于行的 ID,会怎样? 这不是您要求的,但您可以轻松地将其修改为 then id end IsExwhere IsEx is not null 并更新您喜欢的任何列。 我知道这不是我问的,我只是想知道这是否可能。非常感谢! 一切皆有可能,除非不是:)

以上是关于如果行不是重复的,或者行的 ID 不是 SQL SSMS 中的某个数字,则更新列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Query - 在一个结果行中显示连接结果[重复]

ORACLE SQL仅返回重复值(不是原始值)

如果行存在于另一个表中,如何更新 (SQL)

MySQL:如果值存在,则对行进行更新,如果值不存在,则插入 [重复]

检查表是不是重复的过程 - Oracle PL/SQL

SQL:多次重复结果行,并对行进行编号