这不是一个真实的例子,它已经困扰了我一段时间了,我会非常感谢任何可以解释这种行为的人。
我有这两个表
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。我不是在写问题的结果,而是为了缩短问题,但如果需要,我可以提供。
select *
from
mytable1 a,
mytype b
where
a.type=b.id(+)
and b.description ='TYPE'
order by a.id
select *
from
mytable1 a,
mytype b
where
a.type=b.id(+)
and b.description(+) ='TYPE'
order by a.id
select *
from
mytable1 a,
mytype b
where
a.type=b.id(+)
and (b.description ='TYPE' or b.description is null)
order by a.id
提前致谢,
答案 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
字段。