Sql 基于第二个表查找表中属于同一个表的属性的有效方法

Sql 基于第二个表查找表中属于同一个表的属性的有效方法,sql,join,informix,Sql,Join,Informix,我有两张桌子: person ---------- id name 1 peter 2 paul 3 mary 4 george 5 andy 及 如果我知道名字的话,查找所有属于同一个人的ID最有效的查询是什么。假设我想知道:“玛丽和谁住在一起”?玛丽本人的身份证是3号。我查了一下钥匙的下落,钥匙是玛丽的,是2号。现在我可以在living中检索到所有与键2相关的ID,并且我拥有与Mary一起生活的ID 到目前为止,我得到的是: SELECT p2.name FROM

我有两张桌子:

person
----------
id  name
1   peter
2   paul
3   mary
4   george
5   andy

如果我知道名字的话,查找所有属于同一个人的ID最有效的查询是什么。假设我想知道:“玛丽和谁住在一起”?玛丽本人的身份证是3号。我查了一下钥匙的下落,钥匙是玛丽的,是2号。现在我可以在living中检索到所有与键2相关的ID,并且我拥有与Mary一起生活的ID

到目前为止,我得到的是:

SELECT p2.name
  FROM person p1
  JOIN living l1
    ON p1.id = l1.id
  JOIN living l2
    ON l1.key = l2.key
  JOIN person p2
    ON l2.id = p2.id
 WHERE p1.name = 'mary'

有更好的办法吗?结果似乎不错,但执行三次
联接感觉不太好

在您的情况下可以做的是:

 DEFINE name CHAR(15);
 LET name = 'mary'
define keyValue char(10);
select l.key into keyValue from person p left outer join living l on p.id= l.id and p.name= name

select p.*, l.* from person p left outer join living l on p.id=l.id 
where key= keyValue
我以前从未使用过Informix,但是最好的解决方案应该是沿着这些思路,或者至少接近这些思路。
谢谢

我觉得这三个连接很好,我没有看到更明显的方法。你的基本要求是“给我
living
中与玛丽身份相关的所有钥匙(不包括玛丽的钥匙),并使用这些钥匙,从
person
中给我取人名。这里有一个SQLFIDLE,我看不到其他简单的方法来处理这个问题,我的建议是删除“ansi”“以非ansi标准编码和编写,这样可以让数据库/优化选择更好的方式获取数据。当然,如果有适当的索引会有很大帮助。我脑海中突然出现的一个想法是使用“connect by”资源,但是sql理解起来会更复杂,而且我不相信会有更好的性能。整个代码作为informix语句是无效的。经过大量的修正,可能会进入程序。。。
 DEFINE name CHAR(15);
 LET name = 'mary'
define keyValue char(10);
select l.key into keyValue from person p left outer join living l on p.id= l.id and p.name= name

select p.*, l.* from person p left outer join living l on p.id=l.id 
where key= keyValue