完全外连接不会带来所有结果SQL-Server

时间:2018-02-05 12:39:45

标签: sql sql-server join left-join

我在尝试从联接中检索所有结果时遇到问题。我在SQL小提琴中设置了一个类似的场景,它可以工作,但在SQL Server中它并没有。如果他们要开具发票或发货,我想为所有内容带来结果。

我在SQL-SERVER中获得的结果是

|  No | Order1 | Shipdate |     No | Order1 |  InvDate |
|-----|--------|----------|--------|--------|----------|
| 111 |    222 | 17-01-18 |    111 |    222 | 24-01-18 |
| 222 |    333 | 18-01-18 |    222 |    333 | 24-01-18 |

即使将连接更改为完全外部,右连接仍然会得到此结果。

我想如果我使用完全外部它将带来所有结果,不管匹配但不是。

我错过了什么来给我全部外部结果?感谢

sql fiddle - http://sqlfiddle.com/#!18/89943/1

4 个答案:

答案 0 :(得分:7)

这是您的查询:

SELECT S.No, s.Order1, s.Shipdate, i.No, i.Order1, i.InvDate 
FROM Ship S LEFT JOIN
     Invoice I
     ON s.No=i.No AND s.Order1 = i.Order1
WHERE S.Person = 1;

LEFT JOIN更改为FULL JOIN并不会改变任何内容。 WHERE子句将FULL JOIN转换为LEFT JOIN,因为该表上的不匹配行的值为NULL,并且WHERE条件失败。

答案 1 :(得分:0)

OUTER JOIN查询可以按如下方式设置:

SELECT
    S.No, s.Order1, s.Shipdate,
    i.No, i.Order1, i.InvDate 
FROM Ship S
FULL JOIN Invoice I
    ON s.No = i.No AND 
      s.Order1=i.Order1
-- WHERE S.Person = 1

并生成输出

enter image description here

但是通过向WHERE子句添加以下过滤条件,OUTER JOIN将使用LEFT OUTER JOIN产生完全相同的结果

WHERE S.Person = 1

左连接

SELECT
    S.No, s.Order1, s.Shipdate,
    i.No, i.Order1, i.InvDate 
FROM Ship S
LEFT JOIN Invoice I
    ON s.No = i.No AND 
      s.Order1=i.Order1
WHERE S.Person = 1

enter image description here

答案 2 :(得分:0)

从这个意义上说,Full Outer Join将给出符合ON子句标准的任何行(S. [No] = I。[No] AND S.Order1 = I.Order1)然后任何行不符合ON条款标准。符合ON条款标准,但符合WHERE标准。

因此有必要包括WHERE I.Person = 1以及WHERE S.Person = 1但是由OR条款限定那些尚未发货但尚未发货但未开具发票的行(如果有的话)

SELECT S.[No],S.Order1,S.Shipdate,I.No,I.Order1,I.InvDate 
FROM Ship S FULL OUTER JOIN Invoice I 
ON S.[No]=I.[No] AND S.Order1=I.Order1 
WHERE S.Person=1 OR I.Person=1

我假设您只关注第1个人的数据。

答案 3 :(得分:-1)

您可以使用交叉联接来获取此结果。

代码

SELECT S.No, s.Order1, s.Shipdate, i.No, i.Order1, i.InvDate 
FROM Ship S CROSS JOIN
     Invoice I
WHERE S.Person = 1;