【问题标题】:sqlite How to add another subqueries?sqlite 如何添加另一个子查询?
【发布时间】:2020-09-10 03:46:53
【问题描述】:

我在 sqlite 查询中:

 从测试中删除
      不在的地方(
            选择 * 从 (
                   从测试 GROUP BY z 中选择 MAX(a)
                     )
它工作正常。如果有另一行具有相同的“a”最大值,问题就开始了。在这种情况下,不会删除任何行。 如何添加另一个条件(子查询) - 什么时候有两个相同的最大值,b 列中的数字决定应该删除哪一行?

【问题讨论】:

  • 我认为您不能在 SQLite 上使用 WHERE IN 进行此查询。在其他支持元组语法的数据库(例如 MySQL)上可能是可能的。

标签: sqlite


【解决方案1】:

如果您想为每个z 保留最大a 的行并删除其他行,那么您可以使用EXISTS

DELETE FROM test
WHERE EXISTS (
  SELECT 1 FROM test t
  WHERE t.z = test.z AND a > test.a
)

或者使用相关的子查询:

DELETE FROM test
WHERE a < (SELECT MAX(t.a) FROM test t WHERE t.z = test.z)

或者通过使用ROW VALUES 和运算符IN

DELETE FROM test
WHERE (z, a) NOT IN (SELECT z, MAX(a) FROM test GROUP BY z)

编辑:

如果您有另一列 b 可以解决关联问题,以防有超过 1 行具有相同的最大值 a,则还可以使用 ROW_NUMBER()RANK() 窗口函数:

DELETE FROM test
WHERE (z, a, b) IN (
  SELECT z, a, b
  FROM (
    SELECT z, a, b, ROW_NUMBER() OVER (PARTITION BY z ORDER BY a DESC, b DESC) rn
    FROM test
  ) t
  WHERE rn > 1  
)

或者删除所有rowidrowid 不同的行,每个z 的最大值为a(如果有联系,则为最大值b):

DELETE FROM test
WHERE rowid <> (SELECT t.rowid FROM test t WHERE t.z = test.z ORDER BY t.a DESC, t.b DESC LIMIT 1)

或者EXISTS:

DELETE FROM test
WHERE EXISTS (
  SELECT 1 FROM test t
  WHERE (t.z = test.z) AND (t.a > test.a OR (t.a = test.a AND t.b > test.b))
);

【讨论】:

  • 如果我有:1行:a=10,b=5,z=ppp; 2行:a=20,b=4,z=ppp;查询'2 line: a=20, b=4, z=ppp'后只剩下。 ;问题是当有: 1 行: a=10, b=5, z=ppp ; 2行:a=10,b=4,z=ppp; 'a' 是一样的,查询后什么都没有删除,但应该删除第 2 行。
  • 此评论应包含在您的问题中以阐明要求。请参阅我编辑的答案。
  • 谢谢。最后一个代码有效,但是对于大数据库来说,它可能需要很多时间吗?我在 SQLiteStudio 中运行它。您的第一个代码(编辑后)向我显示“接近”(“:语法错误”,我厌倦了使用关于 RANK 和 PARTITION 的 sqlitetutorial 站点进行更正,但没有成功:(
  • 你可以在这里看到:db-fiddle.com/f/jvUzVqdJjpy9514JFS1w51/0 查询在语法上是正确的。也许您使用的是旧版本的 SQLite,它不支持非常有效的窗口函数。如果是这种情况,那么恐怕您将不得不使用性能较低的解决方案。
  • 在 sqlite 控制台中,它工作正常且速度非常快。问题出在我的 SqliteStudio 上。
猜你喜欢
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
相关资源
最近更新 更多