我在尝试从联接中检索所有结果时遇到问题。我在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
答案 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
并生成输出
但是通过向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
答案 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;