从具有 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 个不同条目?