繁体   English   中英

每个外键的SQL子选择

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM