从多个表中选择具有sqlite中的公共字段的行

时间:2013-01-14 17:26:54

标签: sql sqlite

我有一张表格如下:

create table table1(id integer,firstname text,lastname text);

id firstname lastname

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

现在我有另一个表创建表table2(id整数,位置整数);

id位置

===========
1 5
1 9
2 6
3 7
6 2 <

我想选择带有姓氏的行,其中姓氏必须由ben和rob共享,而firstnames必须是ben和rob。
现在我也希望ben的位置比rob的位置小一些,因此结果将是:

id firstname姓氏位置

===========================
1本泰勒5
2抢泰勒6

sql查询应该是什么?

3 个答案:

答案 0 :(得分:2)

获取姓氏:

select lastname
from names n join
     position p
     on n.id = p.id
where firstname in ('ben', 'rob')
group by lastname
having count(distinct firstname) = 2 and
       1+max(case when firstname = 'ben' then p.position end) = max(case when firstname = 'rob' then p.position end)

然后,您可以使用以下内容获取原始列表:

select n.*, p.position
from names n join
     position p
     on n.id = p.id
where firstname in ('ben', 'rob') and
      lastname in (select lastname
                   from names n join
                        position p
                        on n.id = p.id
                   where firstname in ('ben', 'rob')
                   group by lastname
                   having count(distinct firstname) = 2 and
                          1+max(case when firstname = 'ben' then p.position end) = max(case when firstname = 'rob' then p.position end)
                  )

我认为以下查询可以回答您的问题,但需要注意的是,这会将名称合并为一行:

select nben.*, p.position, nrob.*, prob.position
from names nben join
     positions p
     on nben.id = p.id and
        nben.firstname = 'ben' join
     names nrob
     on nrob.firstname = 'rob' and
        nrob.lastname = nben.lastname join
     positions prob
     on nrob.id = prob.id and
        p.position = prob.position - 1

此外,这是未经测试的。

答案 1 :(得分:0)

这给了我从Gordon Linoff的解决方案中获得的结果:
select * from(选择n。*,p.position
来自姓名n加入
     位置p
     在n.id = p.id
其中firstname('ben','rob')和
      姓氏(选择姓氏)                    来自姓名n加入
                        位置p
                        在n.id = p.id
                   其中firstname('ben','rob')
                   按姓氏分组                    有计数(不同的名字)= 2

              )
         )

为x,姓名,职位
其中
(x.id!= names.id和names.id = position.id和names.lastname = x.lastname
和(x.firstname ='rob'和names.firstname ='ben')和x.position = position.position + 1)

(x.id!= names.id和names.id = position.id和names.lastname = x.lastname
和(x.firstname ='ben'和names.firstname ='rob')和x.position + 1 = position.position)


答案 2 :(得分:-1)

Gordon Linoff的解决方案:选择nben。*,p.position
来自name nben join
     职位p
     在nben.id = p.id和
        nben.firstname ='ben'加入
     名字nrob
     在nrob.firstname ='抢'和         nrob.lastname = nben.lastname加入
     职位问题      在nrob.id = prob.id和
        p.position = prob.position - 1

结果如下:

选择*从(选择n。*,p.position
来自姓名n加入
位置p
在n.id = p.id
其中firstname('ben','rob')和
姓氏(选择姓氏) 来自姓名n加入
位置p
在n.id = p.id
其中firstname('ben','rob')
按姓氏分组 有计数(不同的名字)= 2

          )
     )

as x,names,position
where(x.id!= names.id和names.id = position.id
和names.lastname = x.lastname
和(x .firstname ='ben'和names.firstname ='rob')
和x.position + 1 = position.position)