2014-12-19 116 views
1

喜从Oracle迁移到Netezza公司时,我有一个问题,Netezza公司似乎如果多个表使用JOIN`s之前声明有问题。我怎么能写这个连接不同?的Postgres/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....;  
+0

在WHERE子句中是否存在将table1连接到table2的条件(或多个)?如果这样将其转换为JOIN。如果不使用'table1交叉连接表2'。 – 2014-12-19 10:31:19

+0

不,它们没有在WHERE子句中加入。 您是否建议做: 'FROM table1 t1 CROSS JOIN table2 t2 JOIN .. JOIN..'? – hidross 2014-12-19 10:59:40

+0

是如果这两个表的笛卡尔乘积是你所需要的。 – 2014-12-19 11:48:02

回答

0

你根本不应该将旧风格的(隐含的)和新风格(明确的)连接。事实上,一个简单的规则很简单,避免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....; 

这应该在所有你所提到的数据库工作 - 以及更多。

+0

谢谢,我输出的程序不是由我写的,所以我完全不知道从teble1,table2的那些东西是如何工作的。我对所有的连接都感到困惑。你的激动消除了我的想法。 – hidross 2014-12-19 14:07:41