【问题标题】:SQL: How to delete all items in a group if one matches a condition?SQL:如果符合条件,如何删除组中的所有项目?
【发布时间】:2021-04-01 16:10:20
【问题描述】:

我希望创建一个函数,如果其中任何一个符合特定条件,则可以删除组中的所有项目。

具体来说,我有一个数据集“家庭”,如果该家庭包含双胞胎,我想删除该家庭的所有成员。

数据集的一部分如下所示:

Subject ID Mother_ID Zygosity_SR
1001 2001 MZ
1002 2001 MZ
1003 2001 NotTwin
1004 2002 NotTwin
1005 2002 NotTwin

在这种情况下,我想删除所有具有与 Zygosity_SR = MZ 的主题相同 Mother_ID 的个人的行。

我的结果表如下所示:

Subject ID Mother_ID Zygosity_SR
1004 2002 NotTwin
1005 2002 NotTwin

这是我到目前为止的 SQL 代码,但我真的可以使用一些指导来了解从这里去哪里:

proc sql; 
delete from family 
where ZygositySR = 'MZ'
group by Mother ID
;

非常感谢!

【问题讨论】:

    标签: sql group-by conditional-statements


    【解决方案1】:

    使用exists:

    delete from family 
        where exists (select 1
                      from family f2
                      where f2.mother_id = family.mother_id and
                            f2.ZygositySR = 'MZ'
                     );
    

    【讨论】:

    • 当我运行该代码时,它会删除数据集中的所有主题,您对如何解决此问题有任何提示吗?我也收到一个错误:此 DELETE/INSERT 语句递归地引用目标表。这样做的后果是可能出现数据完整性问题”非常感谢
    • @Randy 。 . .这是奇怪的行为。这是标准 SQL——所以我可以理解它可能无法运行(某些功能不支持),但不知道它如何做其他事情。您可能需要创建一个临时数据集来执行此操作。
    【解决方案2】:

    如果exists 不起作用,那么替代in 方法怎么样

    delete from family
    where mother_Id in (select Mother_Id from family where zygosity_SR='MZ')
    

    【讨论】:

    • 这正确删除了“MZ”双胞胎,但没有删除他们的“NotTwin”兄弟姐妹。您认为我需要在其中一个位置替换“Mother_ID”以删除 MZ 双胞胎及其兄弟姐妹吗?非常感谢
    • @Randym也许就这么简单 - 已编辑为更简单的查询,没有任何关联,我认为这就是您想要的。
    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2010-10-13
    • 2011-03-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多