关于SQL左连接的语法问题(100分)

  • 主题发起人 主题发起人 sasacat
  • 开始时间 开始时间
S

sasacat

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在遇到一个ORACLE,与MS SQL SERVER左连接的语法不统一的问题。我们知道SQL92标准
的左连接语法是:
'SELECT Table1.Field1, Table2.Field2 FROM Table1 LEFT OUTER JOIN
Table2 ON Table1.Field1 = Table2.Field2'
这也是微软支持的,可是ORACLE不支持,他的语法是 'SELECT Table1.Field1,
Table2.Field2 FROM Table1, Table2 WHERE Table1.Field1 = Table2.Field2(+)'
一开始,我们用了一种变通的办法用MS SQL SERVER的旧的语法 'SELECT Table1.Field1,
Table2.Field2 FROM Table1, Table2 WHERE Table1.Field1 *= Table2.Field2'
因为比较相似替换起来比较容易,可是最近发现这个语法有问题,比如,我要用一个额外
条件限制子表的某些字段时候结果没有用处。
'SELECT Table1.Field1, Table2.Field2 FROM Table1, Table2 WHERE Table1.Field1 *=
Table2.Field2 and Table2.Field2 <> SomeValue'
如果标准的结果是应该过滤Table2.Field2 <> SomeValue' 的记录,可是没有用。而且,
‘*= ’在将来的MS SQL SERVER版本中会不再支持。有没有谁知道一个比较好的办法,就是
一个比较通用的左连接语法适应大多数数据库,或起码ORACLE和SQL SERVER,至少形式上
比较接近,
以便我替换时候容易一些。
 
好象目前没有,除非自己写。
 
'SELECT Table1.Field1, Table2.Field2 FROM Table1 LEFT JOIN
Table2 ON Table1.Field1 = Table2.Field2'
"去OUTER"
 
用编译指令控制吧
虽然写代码多点,还是有用的
 
Oracle上外连接可以使用(+),
SQL Server 上可以使用*。
差不多的、
 
要理解(+)
a left join b on a.x=b.x 相当于oracle的 a.x=b.x(+)
a right join b on a.x=b.x 相当于oracle的 a.x(+)=b.x
左右反了的,(+)表示添加null的数据与另外一个连接
oracle8i以下没直接的full join
9i好象有join命令了

 
多人接受答案了。
 
后退
顶部