如何从自联接中删除两行

Posted

技术标签:

【中文标题】如何从自联接中删除两行【英文标题】:How can I delete two rows from a self-join 【发布时间】:2014-07-22 18:33:33 【问题描述】:

使用 SQL Server 2008 R2:我有一个名为 Data 的表。我想删除活动 A 和活动 B 都发生在同一帐户的同一日期范围内的所有行(如下面由字段“键”表示),因为它们一起构成“清洗”。

如果我编码:

Delete Data D1
from Data1
inner join Data D2
on D1.key = D2.key
and D1.Activity = 'A'
and D2.Activity = 'B'
and D1.TranDate < EndDateRange
and D1.TranDate >= BeginDateRange
and D2.TranDate < EndDateRange
and D2.TranDate >= BeginDateRange

我可以从表中删除具有活动“A”的行。我怎样才能删除活动“B”?我可以在同一个查询中执行此操作吗?删除 A 行后,帐户将不再显示清洗条件。

【问题讨论】:

要么在结构本身的表之间强制级联删除。或者,您必须有一个过程根据从查询中获得的数据集执行单个删除。您希望在事务中这样做,以便在您提交之前都成功;否则您将失去识别重复内容的能力。或者,如果您有备用字段,您可以更新两个表中的字段,然后从已设置该字段标志的表中删除。或者您可以创建一个带有临时表保存结果的过程,然后根据临时表中的内容从两者中删除... xQBert,感谢您的回复。你能详细说明吗?什么是级联删除? 通过下面的链接查看答案。 How do I use cascade delete with SQL Server?的可能重复 【参考方案1】:

如何删除活动“B”?

use cascade delete - 对 Marc_s 的支持,他编辑了您的问题并在之前的帖子中为您提供了答案。 use a trigger 使用过程和临时表将结果写入临时表,然后根据临时表中的内容从每个表中删除。 在两个表中设置一个标志并根据标志删除临时删除所需的关联因此当您从一个表中删除时,您仍然有一个标记为您需要删除。 使用过程和(颤抖)光标 这里有很多选择...只是取决于情有可原的情况。列出的顺序是在简单情况下我会尝试的顺序。

我可以在同一个查询中执行此操作吗?

仅当在两个表之间启用了级联删除;或者你有一个触发器或可以触发第二次删除的东西。 You can't delete from two tables at once

【讨论】:

由于可能还有活动“C”、“D”等(我不想删除),我将按照您的建议使用备用字段来标记清洗条目.感谢您对可能性的讨论。 这就是情有可原的情况很重要的原因。没有一个答案适用于所有情况。上下文很重要,因此需要提供选项以涵盖可能尚未传达的上下文。考虑到我们所知道的情况,级联删除似乎是我最好的答案:但是,可能比所呈现的更多,因此还有其他选项。祝你好运! (跳出框框思考?什么框框?)

以上是关于如何从自联接中删除两行的主要内容,如果未能解决你的问题,请参考以下文章

了解在 SQL 查询的自联接中使用“Between”条件时的逻辑查询处理

使用 PIG 或 HIVE 从 CSV 中删除前两行

Ruby Gem Squeel,如何编写自联接

SQLAlchemy:在 MySQL 上使用自联接创建删除查询

如何改进包含存储过程使用的多个自联接的视图

如何删除仅通过 ID 不同的两行