Sql 外连接的固定条件
这不是一个真实的例子,这是困扰我一段时间的事情,我非常感谢任何能解释这种行为的人 我有这两张桌子Sql 外连接的固定条件,sql,oracle,outer-join,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
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,它返回两个表MyTable1A和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子句或bin where子句中也可以获得相同的结果
我想了解它们的奇怪行为,并尝试找到一个适用于所提供示例的行为。
对我来说最奇怪的是SQL2。我不是为了缩短问题的时间而写查询结果,但如果需要,我可以提供查询结果
SQL1
SQL2
SQL3
提前感谢,停止使用旧的笛卡尔乘积语法。联接语法是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为NULL,但据我回忆,ORACLE将0长度字符串视为NULL。因此,最好测试id字段是否存在无连接。停止使用旧的笛卡尔乘积语法。联接语法是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为NULL,但据我回忆,ORACLE将0长度字符串视为NULL。因此,最好测试id字段是否存在未联接情况。如果在oracle中使用+执行外部联接,然后,您需要将此运算符添加到所有连接的列中。隐式连接是SQL反模式在SQL Server中,=+连接十多年来一直提供不一致的结果,它甚至告诉您,在SQL Server 2000联机丛书中。在任何情况下都不应使用它。隐式连接是一种可怕的编码实践,20年前就被取代了。你为什么还在用它们。您会使用十年前被替换的C代码吗?如果您在oracle中使用+执行外部联接,然后,您需要将此运算符添加到所有连接的列中。隐式连接是SQL反模式在SQL Server中,=+连接十多年来一直提供不一致的结果,它甚至告诉您,在SQL Server 2000联机丛书中。在任何情况下都不应使用它。隐式连接是一种可怕的编码实践,20年前就被取代了。你为什么还在用它们。您会使用十年前被替换的C代码吗?这将返回一些错误的命中,因为mytype中的一些描述值甚至在外部联接之前都是空的。应使用或b.id为空instead@ConradFrix-那么如何从myTable中筛选出第1、2、4、5、7和8行?@btilly-请详细说明这如何不会给出问题中的示例结果?在myType表中,第1-9行连接,第10行不连接,但保留为左连接。然后WHERE子句过滤掉第1、2、4、5、7、8行,留下第3、6、9和10行。与示例中完全相同。如果这是不正确的,请你举例说明,等等?@richardtz@Dems'查询的编写方式是从MyTable1中获取记录,以及MyType中的匹配记录。从中,仅包括MyType中没有匹配记录或MyType描述选项为TYPE的结果。我和其他人建议这样做的方式是获取MyTable1中的所有记录,如果描述是type,则获取MyType中的记录。注意:或b.id为null在连接条件中永远没有意义,因为它将始终为false。如果它为null,则不会满足b.id=a。type@richardtz显示SQL语句及其行为方式。您需要向下滚动以返回一些错误点击,因为mytype中的某些描述值甚至在外部联接之前都为null。应使用或b.id为空instead@ConradFrix-那么如何从myTable中筛选出第1、2、4、5、7和8行?@btilly-请详细说明这如何不会给出问题中的示例结果?在myType表中,第1-9行连接,第10行不连接,但保留为左连接。然后WHERE子句过滤掉第1、2、4、5、7、8行,留下第3、6、9和10行。与示例中完全相同。如果这是不正确的,请你举例说明,等等?@richardtz@Dems'查询的编写方式是从MyTable1中获取记录,以及MyType中的匹配记录。从中,仅包括MyType中没有匹配记录或MyType描述选项为TYPE的结果。我和其他人建议这样做的方式是获取MyTable1中的所有记录,如果描述是type,则获取MyType中的记录。注意:或b.id为null在连接中没有意义 条件,因为它总是错误的。如果它为null,则不会满足b.id=a。type@richardtz显示SQL语句及其行为方式。你需要向下滚动
select *
from
mytable1 a,
mytype b
where
a.type=b.id(+)
and (b.description ='TYPE' or b.description is null)
order by a.id
SELECT
*
FROM
myTable1 a
LEFT JOIN
myType b
ON b.id = a.type
WHERE
b.description = 'TYPE'
OR b.id IS NULL