[英]Sql subselect per foreign key
我有一张这样的桌子:
人员表:
Name | Age | FK Adress
Thomas | 50 | 1
Lisa | 20 | 1
Lisa | 20 | 2
Ramon | 31 | 3
Kata | 56 | 4
Thomas | 50 | 5
Robert | 73 | 6
Karl | 78 | 7
Edda | 11 | 8
Yogi | 22 | 9
现在,用户想要拥有托马斯50和莉萨20都必须位于的所有地址。 我只想找回FK 1。
我的解决方案如下(示例代码):
select fk
from person
where name = thomas and age = 50
and fk in
(select fk from person where name = lisa and age = 20)
这可行,但是给它一个更好的解决方案作为子选择?
您可以使用,但是FK通常是另一个表中的PK。 也许您可以从那张桌子开始?
select pk
from address a
where
exists (
select 'x' from person p
where name = 'lisa' and age = 20 and p.fk = a.pk) and
exists (
select 'x' from person p
where name = 'thomas' and age = 50 and p.fk = a.pk)
或者,您可以计算匹配的名称。 尽管可能会更慢,但这将使添加名称更加容易。
select pk
from address a
where
2 = -- the number of names that should match
(select count('x')
from person p
where
p.fk = a.pk and
( (name = 'lisa' and age = 20) or
name = 'thomas' and age = 50)
)
另外,只要名称,年龄和fk的组合唯一,则内部联接将起作用,否则您将得到双重结果:
select a.pk
from
address a
inner join person l on l.fk = a.pk and l.name = 'lisa' and l.age = 20
inner join person t on t.fk = a.pk and t.name = 'thomas' and l.age = 50
我不知道它们是否会胜过您自己的查询,但是如果您愿意,我认为两者在语义上都更正确,并且可能更易于理解和扩展。
自我加入?
Select a.fk
from person a inner join person b on a.fk = b.fk
where a.name = 'thomas' and a.age = 50
and b.name = 'lisa' and b.age = 20
不知道这是否会超过瓶坯,但应该做得不错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.