麻烦Sqlite子查询

时间:2016-03-02 04:38:27

标签: sqlite subquery

我的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

有人可以提供一些见解吗?谢谢

2 个答案:

答案 0 :(得分:1)

有很多选项,但最简单的可能是使用cell.imageView?.contentMode = UIViewContentMode.Center cell.imageView?.contentMode = UIViewContentMode.ScaleAspectFit switch (post.priorityLevel){ case "High Priority Posting": cell.imageView?.image = UIImage(named: "High Priority Posting") case "Priority Posting": cell.imageView?.image = UIImage(named: "Priority Posting") case "General Posting": cell.imageView?.image = UIImage(named: "General Posting") default: print("Priority Level can't be loaded to table") } ;

EXISTS

An SQLfiddle to test with

...或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 ) ...

NOT IN

Another SQLfiddle

答案 1 :(得分:0)

使用您的数据集:

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

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