来自多个表的 Postgres/netezza 多重连接

Posted

技术标签:

【中文标题】来自多个表的 Postgres/netezza 多重连接【英文标题】:Postgres/netezza multiple join from multiple tables 【发布时间】:2014-12-19 10:26:25 【问题描述】:

您好,我从 ORACLE 迁移到 Netezza 时遇到问题,如果在使用 JOIN 之前声明了多个表,netezza 似乎有问题。我怎么能以不同的方式写这个加入?

INSERT INTO...
SELECT...
FROM table1 t1, table2 t2   //here seems to be the problem as postgres dont allow to put two tables in FROM clause if there are JOIN`s involved
JOIN talbe3 t3 ON t2.column = t3.column
JOIN table4 t4 ON t2.column = t4.column
LEFT OUTER JOIN table5 t5 ON (t4.column=t5.column AND t4.column=t2.column AND t4.column=t3.column)

WHERE....;    

【问题讨论】:

WHERE 子句中是否有条件(或更多)将 table1 连接到 table2?如果是这样,将其转换为 JOIN。如果不使用table1 cross join table 2 不,它们没有加入 WHERE 子句。你建议这样做:FROM table1 t1 CROSS JOIN table2 t2 JOIN.. JOIN.. 是的,如果您需要这两个表的笛卡尔积。 【参考方案1】:

您根本不应该混合使用旧式(隐式)和新式(显式)连接。事实上,一个简单的规则就是避免在from 子句中使用逗号。

我想您遇到的问题是表别名的范围问题。我知道这发生在 mysql 中。但是,因为我从不from 子句中使用逗号,所以我不知道这会如何影响其他数据库。我认为from子句的部分之后逗号被解析为一个单元,之前定义的别名在这个解析阶段是未知的。

无论如何,不​​管是什么问题,简单的解决办法就是用CROSS JOIN替换逗号:

INSERT INTO...
SELECT...
FROM table1 t1 CROSS JOIN table2 t2   //here seems to be the problem as postgres dont allow to put two tables in FROM clause if there are JOIN`s involved
JOIN table3 t3 ON t2.column = t3.column
JOIN table4 t4 ON t2.column = t4.column
LEFT OUTER JOIN table5 t5 ON (t4.column=t5.column AND t4.column=t2.column AND t4.column=t3.column)

WHERE....;   

这应该适用于您提到的所有数据库——甚至更多。

【讨论】:

谢谢,我导出的程序不是我写的,所以我不完全理解 FROM teble1,table2 中的那些东西是如何工作的。所有的连接都让我感到困惑。你的解释让我清醒了。

以上是关于来自多个表的 Postgres/netezza 多重连接的主要内容,如果未能解决你的问题,请参考以下文章

来自两个表的 PL/SQL 唯一列标识

来自多个表的复杂 SUM

如何使用来自多个表的信息更新表[关闭]

来自多个表的 MySQL 最新相关记录

合并来自多个excel的一张表的数据

优化来自多个表的连接查询