基于第二个表在表中查找属性的有效方法
Posted
技术标签:
【中文标题】基于第二个表在表中查找属性的有效方法【英文标题】:Efficient way for finding attributes in a table which belong together, based on second table 【发布时间】:2013-10-23 09:01:40 【问题描述】:我有两张桌子:
person
----------
id name
1 peter
2 paul
3 mary
4 george
5 andy
和
living
-------
id key
1 1
2 1
3 2
4 2
5 2
如果我知道 name,那么查找 person 中所有 ID 的最有效查询是什么。假设我想知道:“玛丽和谁住在一起”?在 person 中,Mary 的 id 是 3。我检查了 living 中属于 Mary 的键,即 2。现在我可以检索 living 与键 2 一起使用,我有与 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'
有没有更好的方法?结果好像还可以,但是执行三个JOINS
感觉不太对。
【问题讨论】:
三个连接对我来说看起来不错,但我没有看到更明显的方法。您基本上要问的是“让我获得living
中与 mary 的 id 相关联的所有键(不包括 mary's 键)并使用这些键,获取我是来自person
的人的名字。这是一个 SQLFiddle - sqlfiddle.com/#!1/002c8/6
我没有看到其他简单的方法来处理这个问题,我的建议是删除“ansi”代码并编写为非 ansi 标准,这样可以让数据库/优化选择更好的方法获取数据。当然,如果有适当的索引会有很大帮助。
我脑海中的一个想法是使用“connect by”资源,但是 sql 会更复杂,我不相信会有更好的性能。
【参考方案1】:
你可以做的是:
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,但是最好的解决方案应该是沿着这些思路或至少接近它们。 谢谢
【讨论】:
整个代码作为informix 语句无效。经过大量的更正可能会进入程序......以上是关于基于第二个表在表中查找属性的有效方法的主要内容,如果未能解决你的问题,请参考以下文章