从具有 SQLite 中的公共字段的数据库表中选择行

Posted

技术标签:

【中文标题】从具有 SQLite 中的公共字段的数据库表中选择行【英文标题】:select rows from a database table with common field in sqlite 【发布时间】:2013-01-14 13:05:28 【问题描述】:

我有一张如下表:

创建表table1(id整数,名字文本,姓氏文本);

名字姓氏

================= 1 本·泰勒 2 抢泰勒 3 抢劫史密斯 4 抢劫僵尸 5 彼得·史密斯 6 本·史密斯 7 peter taylor

我想选择带有 lastname 的行,其中 lastname 必须由 ben 和 rob 共享,firstnames 必须是 ben 和 rob。 因此,在上表中,选择查询的结果必须是: 1 本·泰勒 2 抢泰勒 3 抢劫史密斯 6 本·史密斯

必须是什么 sql 查询才能得到上述结果? 我试过 - select * from table1 as a,table1 as b where a.firstname='ben' and b.firstname='rob' and a.lastname=b.lastname 这加入了所有结果行,这不是我想要的。

【问题讨论】:

【参考方案1】:

您可以使用两个过滤连接来要求姓氏与 Ben 和 Rob 共享:

select  *
from    Table1 t1
join    Table1 rob
on      rob.firstname = 'rob'
        and t1.lastname = rob.lastname
join    Table1 ben
on      ben.firstname = 'ben'
        and t1.lastname = ben.lastname
where   t1.firstname in ('ben', 'rob')

Live example at SQL Fiddle.

【讨论】:

谢谢。假设数据库很大,以千兆字节为单位,包含额外的列,您提到的包含连接的查询不会比下面 Stefan 编写的查询慢吗? 查询基本上是等价的,数据库甚至可能以完全相同的方式执行它们。如果不进行测试,很难判断哪个实际上性能更好,性能甚至可能取决于数据库甚至数据库版本。 我已将我的问题编辑为一个新场景,如果不应该以这种方式编辑问题,我很抱歉。 新场景属于我认为的新问题。人们应该能够在不了解其历史的情况下阅读您的问题及其答案。【参考方案2】:
select * 
from table1 where first_name = 'ben' or first_name = 'rob' 
and last_name 
in (select last_name from table1 where first_name = 'rob' and last_name 
in (select last_name from table1 where first_name = 'ben'))

【讨论】:

以上是关于从具有 SQLite 中的公共字段的数据库表中选择行的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQLite 中的表中选择最新的 100 个不同条目?

从 SQL Server 中具有公共 ID 的多条记录中选择数据

从 sqlite 表中选择随机行

如何从sqlite中的多个表中选择特定列?

如何从基于 sqlite 的日期约束中提取数据

从 2 个不同片段的 sqlite 中的 2 个表中获取信息