【问题标题】:select rows from a database table with common field in sqlite从具有 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 这加入了所有结果行,这不是我想要的。

【问题讨论】:

    标签: sql sqlite


    【解决方案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'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      相关资源
      最近更新 更多