【问题标题】:Trouble with Sqlite subquerySqlite 子查询的问题
【发布时间】:2016-03-02 04:38:27
【问题描述】:

我的CustomTags 表可能有一系列“临时”记录,其中Tag_ID 为0,Tag_Number 将有一些五位数的值。

定期,我想清理我的 Sqlite 表以删除这些临时值。

例如,我可能有:

Tag_ID      Tag_Number
0           12345
0           67890
0           45678
1           12345
2           67890

在这种情况下,我想删除前两条记录,因为它们与实际的 Tag_ID 1 和 2 重复。但我不想删除第三条记录,因为它还没有被重复。

我尝试了许多不同类型的子查询,但就是无法正常工作。这是我尝试的最后一件事,但我的数据库客户端抱怨未知语法错误。 (我尝试过使用和不使用AS 作为别名)

DELETE FROM CustomTags t1
WHERE t1.Tag_ID = 0
    AND (SELECT COUNT(*) FROM CustomTags t2 WHERE t1.Tag_Number = t2.Tag_Number) > 1

谁能提供一些见解?谢谢

【问题讨论】:

  • 如果您发现其中一个答案令人满意,我建议您通过将其标记为已接受来结束您的问题。

标签: sqlite subquery


【解决方案1】:

有很多选择,但最简单的可能是使用EXISTS;

DELETE FROM CustomTags
WHERE Tag_ID = 0
  AND EXISTS(
    SELECT 1 FROM CustomTags c
    WHERE c.Tag_ID <> 0 AND c.Tag_Number = CustomTags.Tag_Number
  )

An SQLfiddle to test with.

...或NOT IN...

DELETE FROM CustomTags
WHERE Tag_ID = 0
  AND Tag_Number IN (
    SELECT Tag_Number FROM CustomTags WHERE Tag_ID <> 0
  )

Another SQLfiddle.

【讨论】:

    【解决方案2】:

    像这样使用您的数据集:

    sqlite> select * from test;
    tag_id      tag_number
    ----------  ----------
    1           12345
    1           67890
    0           12345
    0           67890
    0           45678
    

    你可以运行:

    delete from test 
    where rowid not in (
      select a.rowid 
      from test a 
      inner join (select tag_number, max(tag_id) as mt from test group by tag_number) b 
        on a.tag_number = b.tag_number 
        and a.tag_id = b.mt
    );
    

    结果:

    sqlite> select * from test;
    tag_id      tag_number
    ----------  ----------
    1           12345
    1           67890
    

    请使用更多的测试用例进行测试,而不是完全确定这是您想要的。我建议在大型数据集上运行之前创建数据库的副本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-23
      • 1970-01-01
      • 2015-09-27
      • 2015-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多