Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL获取多行具有相似数据的行_Sql_Sqlite - Fatal编程技术网

SQL获取多行具有相似数据的行

SQL获取多行具有相似数据的行,sql,sqlite,Sql,Sqlite,我有一个ID(PK)、fixed(integer)和许多其他列(名称、内容、注释等)的表 创建数据版本时,我希望检查新的或更新的行是否有固定值为1或更高的重复行。(要编辑具有固定值的行,您需要更多权限) 创建版本历史记录后,应为: ID | Fixed | name 1 | 2 | "john" 3 | 1 | "jane" 4 | 0 | "john" //current row 5 | 0 | "jane" //current row 这个查询允许

我有一个ID(PK)、fixed(integer)和许多其他列(名称、内容、注释等)的表

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

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

ID | Fixed | name
1  | 2     | "john"
3  | 1     | "jane" 
4  | 0     | "john" //current row
5  | 0     | "jane" //current row
这个查询允许我为任何新的或更新的行(如果我事先知道它们的ID的话)找到“固定”行的ID值

这个查询有效,但我怀疑它是最好的解决方案

我有以下问题/顾虑:

1) 我必须为每个新的或更新的行运行此查询。每次它都会将表中的一行与所有其他行进行比较。这不是很有效。肯定有更好的办法吗

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


3) 我应该只比较相关的数据列(例如名称)。除了某些列(ID,Fixed)之外,是否有方法对所有列进行选择或内部联接?

首先,您可以将查询重写为联接:

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
值,那么使用
左外部联接
。对于列表,只需在中使用

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;

ID被创建为整数主键自动递增。这会使它成为一个索引吗?我想在固定值为1(或更高)的行中找到给定行的副本。拥有一个索引不会有帮助,是吗?@user965972。主键上自动有一个唯一的索引(实际上)。但是,id仍然可以包含在其他索引中。因此,我可以并且应该基于名称和注释(以及其他数据)列创建一个非唯一索引(但不包括id和fixed)?因此,我不应该使用内部连接并根据e.id进行搜索,而应该根据表示e.id的索引id来搜索表?
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;
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;