oracle数据库的SQL转换到postgresql,关于表连接的问题。

Mosshill 2013-11-26 03:14:17
(好吧,其实要转换到富士通的Symfoware数据库,不过Symfoware是建立在postgresql上的。)
问题一:我在网上查到的例子:
ORACLE:
SELECT COUNT(DISTINCT(A.COL1)) AS RCOUNT FROM
  SCHEMA.PREFIX_TABLE1 A,SCHEMA.PREFIX_TABLE2 B,SCHEMA.PREFIX_TABLE3 C,SCHEMA.PREFIX_TABLE4 D
  WHERE 1 = 1
  AND A.COL2 = B.COL2
  AND A.COL3 = C.COL3(+)
  AND A.COL4 = D.COL4(+)
  AND A.COL5 > 0
  AND A.COL6 = '1'
POSTGRESQL:
select count(distinct(a.col1)) as rcount from
  schema.prefix_table1 a inner join schema.prefix_table2 b on (a.col2 = b.col2)
  left outer join schema.prefix_table3 c on (a.col3 = c.col3)
  left outer join schema.prefix_table4 d on (a.col4 = d.col4)
  where 1 = 1
  and a.col5 > 0
  and a.col6 = '1'
这里有一个问题?A.COL2 = B.COL2这一句,必须要写在inner join的on中吗?不可以直接写在where语句中吗?

问题二:
如下的一个oracle的SQL语句,转换为postgresql上是什么样子的呢?
ORACLE:
SELECT A.KEY1,A.KEY2,A.KEY3
FROM A,B,C,D,E
WHERE
A.KEY1 = B.KEY1(+) AND
A.KEY2 = B.KEY2(+) AND
B.KEY3 = C.KEY3(+) AND
A.KEY4 = D.KEY2(+) AND
A.KEY5 = E.KEY1

这里关于A表和B,D的左连接我知道了,但是与A表无关的B.KEY3 = C.KEY3(+)应该怎样转换呢?

请教各位了,多谢!
...全文
771 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
iihero_ 2013-11-29
  • 打赏
  • 举报
回复
引用 2 楼 Mosshill 的回复:
[quote=引用 1 楼 iihero 的回复:] 问题一: A.COL2 = B.COL2这一句, 可以写到where里头 问题二: SELECT A.KEY1,A.KEY2,A.KEY3 FROM A LEFT OUTER JOIN B on A.key1=B.key1 and a.key2=b.key2 LEFT OUTER JOIN C on B.key3=c.key3 .....
多谢版主解答啊~ 关于问题二,我原来以为是要把B和C表先括起来得出个结果再与A连接,那再第三行的时候,是如何区分是要让B表和C表左连接而不是A表呢? 如果Oracle的sql文是这样的: SELECT A.KEY1,A.KEY2,A.KEY3 FROM A,B,C WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY3 = C.KEY3(+) AND A.KEY4 = C.KEY4(+) 那么在POSTGRESQL这边的后面要怎么写呢? 是需要再写一遍LEFT OUTER JOIN C么? SELECT A.KEY1,A.KEY2,A.KEY3 FROM A LEFT OUTER JOIN B on A.key1=B.key1 and a.key2=b.key2 LEFT OUTER JOIN C on B.key3=c.key3 LEFT OUTER JOIN C on A.key4=c.key4[/quote] 应该是。你可以比较一下结果。用事实说话。
Mosshill 2013-11-29
  • 打赏
  • 举报
回复
引用 1 楼 iihero 的回复:
问题一: A.COL2 = B.COL2这一句, 可以写到where里头 问题二: SELECT A.KEY1,A.KEY2,A.KEY3 FROM A LEFT OUTER JOIN B on A.key1=B.key1 and a.key2=b.key2 LEFT OUTER JOIN C on B.key3=c.key3 .....
多谢版主解答啊~ 关于问题二,我原来以为是要把B和C表先括起来得出个结果再与A连接,那再第三行的时候,是如何区分是要让B表和C表左连接而不是A表呢? 如果Oracle的sql文是这样的: SELECT A.KEY1,A.KEY2,A.KEY3 FROM A,B,C WHERE A.KEY1 = B.KEY1(+) AND A.KEY2 = B.KEY2(+) AND B.KEY3 = C.KEY3(+) AND A.KEY4 = C.KEY4(+) 那么在POSTGRESQL这边的后面要怎么写呢? 是需要再写一遍LEFT OUTER JOIN C么? SELECT A.KEY1,A.KEY2,A.KEY3 FROM A LEFT OUTER JOIN B on A.key1=B.key1 and a.key2=b.key2 LEFT OUTER JOIN C on B.key3=c.key3 LEFT OUTER JOIN C on A.key4=c.key4
iihero_ 2013-11-26
  • 打赏
  • 举报
回复
问题一: A.COL2 = B.COL2这一句, 可以写到where里头 问题二: SELECT A.KEY1,A.KEY2,A.KEY3 FROM A LEFT OUTER JOIN B on A.key1=B.key1 and a.key2=b.key2 LEFT OUTER JOIN C on B.key3=c.key3 .....
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。 PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。 事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。 本课程作为PostgreSQL数据库管理二,主要讲解以下内容:1.     PostgreSQL中的子查询2.     PostgreSQL公共达式3.     PostgreSQL数据的修改4.     PostgreSQL中的事务5.     PostgreSQL数据导入和导出6.     PostgreSQL数据库的管理7.     PostgreSQL的管理

952

社区成员

发帖
与我相关
我的任务
社区描述
PostgreSQL相关内容讨论
sql数据库数据库架构 技术论坛(原bbs)
社区管理员
  • PostgreSQL社区
  • yang_z_1
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧