外连接不显示想要的(空)行

时间:2012-03-29 09:23:05

标签: sql oracle join

我有一个包含用户ID,期间ID和数量的表格

User Period Qty
---- ------ ---
   1  11201   3
   1  11202   2
   1  11203   5
   2  11202   4
   2  11203   1

注意:用户2在期间11202开始,因此他/她没有期间11201的行

我只需要从最新的期间获得用户...

SELECT User FROM table WHERE Period = 11203

...然后在同一个表格中使用这些用户ID为两个用户获取Period 11201和11202 Qty。

问题:我需要在期间11201中看到用户2的(null)数量。像这样:

User Period    Qty
---- ------  -----
   1  11201      3
   1  11202      2
   2  11201 (null)
   2  11202      4

我无法弄清楚查询/连接来实现它。到目前为止,我有这个,但可以预见它只给我3行(用户1,期间11201/11202和用户2,期间11202):

SELECT a.User, a.Period, a.Qty
FROM (SELECT User FROM table WHERE Period = 11203) b
LEFT JOIN table a
ON b.User = a.User
WHERE a.Period BETWEEN 11201 AND 11202

3 个答案:

答案 0 :(得分:3)

您的where子句会过滤掉a.Period为空的行。将其移至on子句:

LEFT JOIN table a
ON a.User = b.User
AND a.Period = p.Period
AND a.Period BETWEEN 11201 AND 11202

或明确接受null值:

WHERE a.Period is null OR a.Period BETWEEN 11201 AND 11202

答案 1 :(得分:1)

您需要获得所有必需的时间段并首先与用户制作这些产品的笛卡尔积,然后将外部连接到:

SELECT b.User, p.Period, a.Qty
FROM (SELECT User FROM table WHERE Period = 11203) b
CROSS JOIN (SELECT DISTINCT Period FROM table 
            WHERE Period BETWEEN 11201 AND 11202) p
LEFT JOIN table a
ON a.User = b.User
AND a.Period = p.Period

另请注意,SELECT需要从外部表中获取User和Period而不是内部表,否则所有将在缺少用户的行上为null。

答案 2 :(得分:0)

您是否查看了LEFT / RIGHT和OUTER / INNER连接之间的所有差异? http://dev.mysql.com/doc/refman/5.0/en/join.html