Sql Oracle上的左连接

Sql Oracle上的左连接,sql,oracle,join,Sql,Oracle,Join,我无法按预期使用外部联接处理查询 数据如下: TABLE a: id 1 2 3 TABLE b: id aid 11 1 12 2 TABLE c: id bid 21 11 22 12 查询是: SELECT * FROM a LEFT JOIN b ON a.id = b.aid INNER JOIN c ON b.id = c.bid

我无法按预期使用外部联接处理查询

数据如下:

TABLE a:

    id
    1
    2
    3

TABLE b:

    id  aid
    11  1
    12  2

TABLE c:

    id  bid
    21  11
    22  12
查询是:

SELECT *
FROM
    a
    LEFT JOIN
    b
    ON a.id = b.aid
    INNER JOIN c
    ON b.id = c.bid
我需要得到所有的
a
,如果可能的话,
b
c
,如下所示:

a.id    b.id    b.aid   c.id    c.bid
1       11      1       21      11
2       12      2       22      12
3       null    null    null    null
当前面的
左连接匹配时,
内部连接
只是
b
的扩展

相反,我得到:

a.id    b.id    b.aid   c.id    c.bid
1       11      1       21      11
2       12      2       22      12
没有第二个
内部联接
我得到了预期的结果:

a.id    b.id    b.aid
1       11      1
2       12      2
3       null    null
Oracle和MS SQL Server之间的联接定义似乎有所不同。(结果是错的)


我不知道如何编写查询以获得预期结果。

您的查询将被解释为这样(注意括号):

相反,你的意思可能是:

SELECT *
FROM
    a
    LEFT JOIN
    (
    b
    INNER JOIN c
    ON b.id = c.bid
    )
    ON a.id = b.aid

您的查询的解释如下(请注意括号):

相反,你的意思可能是:

SELECT *
FROM
    a
    LEFT JOIN
    (
    b
    INNER JOIN c
    ON b.id = c.bid
    )
    ON a.id = b.aid

这是正确的行为,SQL Server将返回完全相同的结果。请参见此处的联机示例:

因为你在b和c之间做一个内部连接,这实际上使a和b之间的外部连接无效

如果查看预期输出的最后一行:

a.id    b.id    b.aid   c.id    c.bid
3       null    null    null    null
现在来看连接条件
b.id=c.bid
,很明显它将删除该行,因为
b.id
的值是空的,因为a和b之间存在外部连接,因此内部连接再次删除该行

b和c之间的连接也必须使用外部连接:

SELECT *
FROM a
  LEFT JOIN b ON a.id = b.aid
  LEFT JOIN c ON b.id = c.bid
;

这是正确的行为,SQL Server将返回完全相同的结果。请参见此处的联机示例:

因为你在b和c之间做一个内部连接,这实际上使a和b之间的外部连接无效

如果查看预期输出的最后一行:

a.id    b.id    b.aid   c.id    c.bid
3       null    null    null    null
现在来看连接条件
b.id=c.bid
,很明显它将删除该行,因为
b.id
的值是空的,因为a和b之间存在外部连接,因此内部连接再次删除该行

b和c之间的连接也必须使用外部连接:

SELECT *
FROM a
  LEFT JOIN b ON a.id = b.aid
  LEFT JOIN c ON b.id = c.bid
;

Sql Server和OracleI之间的内部连接和左连接没有区别,如果Sql Server为此返回任何不同的结果,我会非常惊讶。第二个连接需要外部连接,(第二个)内部joi无法连接b.id的空值。因此,您的期望似乎不正确。。oracle和ms sql的工作方式是一样的。例如,我可能记错了。但我如何编写此查询以获得预期结果呢?也许我应该重新表述一下这个问题。Sql Server和Oracle之间的内部连接和左连接没有区别。如果Sql Server为此返回了不同的结果,我会非常惊讶。第二个连接需要外部连接,(第二个)内部joi无法连接b.id的空值。因此,您的期望似乎不正确。。oracle和ms sql的工作方式是一样的。例如,我可能记错了。但我如何编写此查询以获得预期结果呢?也许我该换个说法。真丢脸:)谢谢你,就这样!老实说,我不知道我以前工作的地方是否打开了ANSI NULLS。他们还使用VB.NET将数据从ACCESS虹吸到DB中。所以有可能我在一个
NULL=NULL
的世界里生活了很多年,却没有注意到它(在大学里,我很清楚地知道
NULL
不等于任何其他东西)。@pid:我去掉了那个部分。即使将
ansi_nulls
设置为off,我也不会得到不同的结果,谢谢,就这样!老实说,我不知道我以前工作的地方是否打开了ANSI NULLS。他们还使用VB.NET将数据从ACCESS虹吸到DB中。所以有可能我在一个
NULL=NULL
的世界里生活了很多年,却没有注意到它(在大学里,我很清楚地知道
NULL
不等于任何其他东西)。@pid:我去掉了那个部分。即使
ansi_nulls
设置为off,我也不会得到不同的结果,这正是我想要的。谢谢,另一个答案显示了如何获得结果!是的,这就是我的本意。谢谢,另一个答案显示了如何获得结果!