固定外连接的条件

时间:2012-05-24 16:56:23

标签: sql oracle outer-join

这不是一个真实的例子,它已经困扰了我一段时间了,我会非常感谢任何可以解释这种行为的人。

我有这两个表

MYTABLE1
ID  TYPE    NAME 
1   1       typea
2   2       typea
3   3       typea
4   4       typeb
5   5       typeb
6   6       typeb
7   7       typec
8   8       typec
9   9       typec
10  10      typed

MYTYPE
ID  NAME    DESCRIPTION
1   typea   typea with desc
2   typea   
3   typea   TYPE
4   typeb   typeb with desc
5   typeb   
6   typeb   TYPE
7   typec   typec with desc
8   typec   
9   typec   TYPE

我想要一个从两个表中返回行的sql(mytable1 a,mytype b)

a)MYTABLE1.type = MYTYPE.ID和MYTYPE.description ='TYPE'

b)MYTABLE1.type不在MYTYPE.id

a.id    a.type  a.name  b.id    b.name  b.description
3       3       typea   3       typea   TYPE
6       6       typeb   6       typeb   TYPE
9       9       typec   9       typec   TYPE
10      10      typed   null    null    null

我试过这个陈述没有成功。我想要一个使用外连接的解决方案,而不是联合或嵌套选择。

对于该示例,我使用的是Oracle外连接语法,但我认为通过使用标准语法并将条件a)放在ON子句中或b)放在where子句中可以实现相同的结果

我想要的是理解它们的“奇怪”行为,并尝试找到适合所提供示例的行为。 对我来说最奇怪的是SQL2。我不是在写问题的结果,而是为了缩短问题,但如果需要,我可以提供。

SQL1

select * 
from 
  mytable1 a,
  mytype b
where
  a.type=b.id(+)
  and b.description ='TYPE'
order by a.id

SQL2

select * 
from 
  mytable1 a,
  mytype b
where
  a.type=b.id(+)
  and b.description(+) ='TYPE'
order by a.id

SQL3

select * 
from 
  mytable1 a,
  mytype b
where
  a.type=b.id(+)
  and (b.description ='TYPE' or b.description is null)
order by a.id

提前致谢,

1 个答案:

答案 0 :(得分:4)

停止使用旧的Cartesian产品语法。 JOIN语法是ANSI-92标准。 20年应该足以被认为是稳定的......

SELECT
  *
FROM
  myTable1    a
LEFT JOIN
  myType      b
    ON b.id = a.type
WHERE
     b.description = 'TYPE'
  OR b.id IS NULL

注意:我确实有b.description IS NULL但是,据我所知,ORACLE将0个长度字符串视为NULL。因此,最好在无加入的情况下测试id字段。