来自多个表的 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 多重连接的主要内容,如果未能解决你的问题,请参考以下文章