如何连接一个表两次

时间:2014-10-22 02:36:21

标签: sql database informix

我想在以下语句中加入一个表(zip_code)两次。在zip_code表中,它有两列zip_id和相应的zip_area。我想将master_table secondary_table中的zip_id映射到zip_area。

以下语句无法执行,因为服务器认为“on子句具有无效的表引用”。如何归档此联接?

select 
m.zip_id,
zip1.zip_area as area1,
s.zip_id,
zip2.zip_area as area2
from master_table m, secondary_table s
Left join zip_code zip1 on (zip1.zip_id = m.zip_id)
Left join zip_code zip2 on (zip2.zip_id = s.zip_id)
where m.owner_id = s.owner_id 

2 个答案:

答案 0 :(得分:3)

也许这会起作用

select 
m.zip_id,
zip1.zip_area as area1,
s.zip_id,
zip2.zip_area as area2
from master_table m join secondary_table s on (m.owner_id = s.owner_id)
Left join zip_code zip1 on (zip1.zip_id = m.zip_id)
Left join zip_code zip2 on (zip2.zip_id = s.zip_id)

这有什么问题?

from master_table m, secondary_table s
Left join zip_code zip1 on (zip1.zip_id = m.zip_id)
Left join zip_code zip2 on (zip2.zip_id = s.zip_id)
    来自master_table m的
  1. ,secondary_table s ...其中...... 是一个"旧式"加入(隐含)

  2. secondary_table s LEFT JOIN zip_code ON ... 是一种" ANSI风格的"加入(显式)

  3. 以下是一些信息:http://codeidol.com/community/sql/old-style-versus-ansi-style/3419/

  4. 在上面的FROM子句中有一个ANSI样式的连接:&#34; secondary_table s LEFT JOIN zip_code zip1 on(zip1.zip_id = <强> m.zip_id )&#34;因为没有列&#34; m.zip_id&#34;

  5. 而失败
  6. 如果我们更改加入顺序:FROM secondary_table s, master_table m LEFT JOIN zip_code zip1 on(zip1.zip_id = m.zip_id)LEFT JOIN zip_code zip2 打开(zip2.zip_id = s.zip_id ),然后第一个LEFT JOIN就可以,但第二个将失败(没有列&#34; s .zip_id&#34)

  7. 因此,可以将旧式连接与ANSI样式连接混合(至少在Informix中),但这些连接应该仔细实现。

答案 1 :(得分:0)

根据IBM Documentation,这应该有效:

  

要创建自联接,请在FROM子句中两次列出表,并每次为其分配不同的别名。使用别名来引用Projection和WHERE子句中的表,就像它是两个单独的表一样。

我会去其他地方看看。例如,确保服务器看到的sql是您的想法。