如何使用其他条件从表中删除多行?

lo8azlld  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(355)

我有一张这样的table:

Id  Name     ProductId

1   Apple    1
2   Apple    null
3   Apple    2
4   Orange   1
5   Orange   2
6   Pear     null
7   Lemon    1
8   Lemon    null

我想删除一行,如果它是 ProductId is null 如果是的话 Name is发生多次。
在本例中,如果我运行适当的delete查询,它应该删除以下行:

2   Apple    null
8   Lemon    null

哪种删除查询对我有效?

33qvvth1

33qvvth11#

我建议在加入之前使用聚合或类似的方法:

delete t from test t join
       (select t.name, count(*) as cnt
        from test t
        group by t.name
       ) tt
       on t.name = tt.name
where tt.cnt > 1 and t.product_id is null;

这比没有聚合的自连接要好得多。为什么?因为每一行都只标识一次。在示例数据中,没有聚合的自联接尝试删除行id=2两次(一次用于1的匹配,一次用于3的匹配)。那是不必要的。如果 name 有许多行。
我还认为,你不只是想要一个cnt的2,但你想要一个非- NULL 产品id,即:

delete t from test t join
       (select t.name, count(*) as cnt
        from test t
        where product_id is not null
        group by t.name
       ) tt
       on t.name = tt.name
where tt.cnt >= 1 and t.product_id is null;

这是一把小提琴。

bvk5enib

bvk5enib2#

DELETE t
FROM test t
INNER JOIN test t2
   ON t.name = t2.name
WHERE
   t.product_id is null
   AND t2.id <> t.id

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=e58dc760d30bfaec4e46be7c80729200

相关问题