我有一个带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,固定)之外的所有列上选择或内连接?
答案 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;