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

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 语句无效。经过大量的更正可能会进入程序......

以上是关于基于第二个表在表中查找属性的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

在不借助 PL/SQL 的情况下从第二个表中查找相关值

Access 中的查找值

在表中查找特定关系

Oracle Join 表与第一个表中的日期范围和第二个表中的日期

如何加入/子查询第二个表

使用cakephp 3根据第二个表从数据库中查找记录[重复]