Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 外连接的固定条件_Sql_Oracle_Outer Join - Fatal编程技术网

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