如何将一张桌子连在一起两次



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

以下语句无法执行,因为服务器认为is具有"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 

也许这会起作用

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)
  1. 从master表m,secondary表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样式的联接:"secondary_table sLEFT joinzip_code zip1on(zip1.zip_id=m.zip_id)",该联接失败,因为没有列"m.zip_id"

  5. 如果我们更改加入顺序:从secondary_table s,master_table mLEFT JOINzip_code zip1on(zip1.zip_id=m.zip_id)LEFT JOINzip代码zip2on(zip2.zip_d=s.zip_id),则第一个LEFT JON将正常,但第二个将失败(没有列"s.zip_id")

  6. 因此,可以将旧样式的联接与ANSI样式的联接混合使用(至少在Informix中是这样),但这些联接应该小心实现。

根据IBM文档,这应该有效:

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

我会去别处看看。例如,确保服务器看到的sql是您所想的。

最新更新