【问题标题】:Delete where both columns match删除两列匹配的地方
【发布时间】:2016-11-12 22:10:40
【问题描述】:

我有两张桌子

Person (contain oldest date (farthest in future) when person moved OR WILL moved to another address)

ID                OLDESTADDRESSMOVEDATE

1                     20161117
2                     20171211
3                     20160101


Address           

PersonID             AddressMOVETODATE
 1                       20161117
 1                       20161111
 1                       20141018
 2                       20171211
 2                       20151210

现在我想编写一个 DELETE 查询,它将删除 PERSON 中每个人的 ADDRESS THE ROWS,其中 AddressMOVETODATE 比 OLDESTADDRESSMOVEDATE 列中的要早

例如

如果我运行该查询,ADDRESS 表中的剩余行应该是

PersonID             AddressMOVETODATE
1                       20161117
2                       20171211

我试过了

DELETE FROM ADDRESS WHERE PERSONID = PERSON.ID and AddressMOVETODATE < Person.OLDESTADDRESSMOVEDATE

但它不起作用。此外,我们将如何确保仅输入 Person 表的对应列,例如我们不想把

Person ID = 1 and Person.OLDESTADDRESSMOVEDATE = 20171211 (of Person 2)

请帮忙。

谢谢,

艾登

【问题讨论】:

  • 可能正在使用光标或内部连接
  • 请不要将您的问题标题全部大写。这在此处被认为是在大喊大叫,因为它在网络上的其他任何地方都存在。它不会让你尽快得到答案,它会使文本更难阅读,而且真的很粗鲁和烦人。请有礼貌;键盘两侧都有 Shift 键,便于操作,因为大小写正确的文本更易于阅读和理解。谢谢。
  • 糟糕,抱歉,不会再这样做了

标签: sql sql-server sql-delete


【解决方案1】:

可以使用row_number、cte和delete查询

;WITH cte AS
(
    SELECT *, RowN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY AddressMoveDate DESC) FROM Address
)
DELETE FROM cte WHERE RowN > 1

【讨论】:

  • 不需要在上面的 ID 中添加 Person.ID 吗?如果没有在其中提到 ID,它如何知道 ID 来自 Person?为什么我们也没有使用 OLDESTADDRESSMOVEDATE。
  • 哇。很好的逻辑,但它给出了一些错误 关键字“ORDER”附近的语法不正确。
  • 只需删除 PARTITION BY ID 旁边的逗号即可
  • 太棒了!在我将其标记为答案之前的最后一个问题,如果我还想更新另一个表的列,该表具有与地址相同的数据,但不是删除行,我想更新一个特定列,其中 AddressMOVETODATE 是 LESS(或上一个)比 PERSONID 的每个分区中的最大值?如何使用这种语法更新列?
  • 无法理解您要查找的内容,您想更新同一张表还是不同的表?如果是不同的表,那么你需要加入和更新
猜你喜欢
  • 2022-11-01
  • 2022-08-17
  • 2018-01-29
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多