我想在以下语句中加入一个表(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
答案 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)
,secondary_table s ...其中...... 是一个"旧式"加入(隐含)
secondary_table s LEFT JOIN zip_code ON ... 是一种" ANSI风格的"加入(显式)
以下是一些信息:http://codeidol.com/community/sql/old-style-versus-ansi-style/3419/
在上面的FROM子句中有一个ANSI样式的连接:&#34; secondary_table s LEFT JOIN zip_code zip1 on(zip1.zip_id = <强> m.zip_id 强>)&#34;因为没有列&#34; m.zip_id&#34;
如果我们更改加入顺序: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)
因此,可以将旧式连接与ANSI样式连接混合(至少在Informix中),但这些连接应该仔细实现。
答案 1 :(得分:0)
根据IBM Documentation,这应该有效:
要创建自联接,请在FROM子句中两次列出表,并每次为其分配不同的别名。使用别名来引用Projection和WHERE子句中的表,就像它是两个单独的表一样。
我会去其他地方看看。例如,确保服务器看到的sql是您的想法。