SQL为多行获取具有类似数据的行

时间:2014-10-12 17:13:18

标签: sql sqlite

我有一个带ID(PK)的表,固定(整数)和许多其他列(名称,内容,注释......)

当我创建我的数据版本时,我想检查新行或更新的行是否具有固定值为1或更高的重复行。 (要编辑具有固定值的行,您需要更多权限)

ID | Fixed | name
1  | 1     | "john"
2  | 0     | "john" //new row
3  | 0     | "jane" // updated row

创建版本历史记录后,这应该变为:

ID | Fixed | name
1  | 2     | "john"
3  | 1     | "jane" 
4  | 0     | "john" //current row
5  | 0     | "jane" //current row

此查询允许我查找"固定"的ID值。任何新行或更新行的行(如果我事先知道他们的ID)。

select T.ID 
from MyTable T 
inner join (
      select name, 
      comments 
      from MyTable
      where ID = 2) E
on T.name = E.name 
and T.comments = E.comments 
where T.fixed = 1

此查询有效,但我怀疑它是最佳解决方案。

我有以下问题/疑虑:

1)我必须为每个新行或更新的行运行此查询。每次它将一行与表中的所有其他行进行比较。这不是非常有效。当然有更好的方法吗?

2)我可以在一个查询中搜索所有ID(2和3)并返回匹配的ID(如果没有,则返回null)?

3)我只应比较相关数据列(例如名称)。有没有办法在除一些列(ID,固定)之外的所有列上选择或内连接?

1 个答案:

答案 0 :(得分:1)

首先,您可以像连接一样重写查询:

select T.ID 
from MyTable T inner join
     MyTable e
     on T.name = E.name and T.comments = E.comments and e.id = 2
where T.fixed = 1;

为了提高性能,您需要MyTable(fixed, name, comments, id)上的索引。

如果您希望它返回NULL值,请使用left outer join。对于列表,只需使用in

select T.ID 
from MyTable T left outer join
     MyTable e
     on T.name = E.name and T.comments = E.comments and e.id in (2, 3)
where T.fixed = 1;