我有一张表格如下:
create table table1(id integer,firstname text,lastname text);
现在我有另一个表创建表table2(id整数,位置整数);
我想选择带有姓氏的行,其中姓氏必须由ben和rob共享,而firstnames必须是ben和rob。
现在我也希望ben的位置比rob的位置小一些,因此结果将是:
sql查询应该是什么?
答案 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)