即使没有详细匹配,Oracle SQL也可以从master获取行

时间:2017-03-02 17:00:54

标签: sql oracle join

Oracle SQL从master获取行,即使没有详细匹配。仅对已传递的参数需要来自主服务器的行。传递的参数将是帐号..

 SELECT m.face,
  m.device_num,
  reading_time,
  reading
FROM detail d,
  master FCICMTR
WHERE d.device_id    = m.device_id
AND m.account_number = 100050300;

device_Num  Face Account    device_id
80149309    1    100050300  5554444
80149674    2    100050300  5554444
80000000    3    100050300  5554444
89348000    1    123131312  333333
97654322    1    424245445  444444
87654321    1    342441222  555555
87654321    2    178798978  555555

详细

FACE DEVICE_ID  READING_TIME READING
1    5554444    28-FEB-17    4201
2    5554444    28-FEB-17    220465
1    5554444    27-FEB-17    4200
2    5554444    27-FEB-17    220443
1    5554444    26-FEB-17    4200
2    5554444    26-FEB-17    220377
1    333333     28-FEB-17    343434
1    555555     27-FEB-17    3434
2    555555     26-FEB-17    555

需要结果如:

FACE DEVICE_NUM READING_TIME  READING
1    80149309   28-FEB-17     4201
2    80149674   28-FEB-17     220465
1    80149309   27-FEB-17     4200
2    80149674   27-FEB-17     220443
1    80149309   26-FEB-17     4200
2    80149674   26-FEB-17     220377
3    80000000   NULL          NULL

请注意......结果集中需要一行,即device_num = 80000000,详细信息表中不存在。此设备号码属于相同的帐号100050300是我需要它的原因。

2 个答案:

答案 0 :(得分:0)

使用外部联接。当您希望来自一个表的所有记录和仅来自另一个表的匹配的记录时,将使用外部联接。

有关联接的更多信息:https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

在这种情况下,您希望所有符合条件的主记录和详细记录(如果匹配)。

SELECT m.face,
  m.device_id,
  reading_time,
  reading
FROM detail d
RIGHT JOIN master FCICMTR
 on d.device_num    = m.device_Num
and d.face = m.face
WHERE m.account_number = 100050300;

这就是你所拥有的:

SELECT m.face,
  m.device_num,
  reading_time,
  reading
FROM detail d,
  master FCICMTR
WHERE d.device_id    = m.device_id  --this line causes the problem
AND m.account_number = 100050300;

由于设备80000000没有详细记录;它从你的结果中消失了。因此,您需要外部联接。可以用旧式表示法表示为

WHERE d.device_num (+)= m.device_Num
  and d.face (+)=m.face

虽然过时或使用如上所述的左或右连接的当前标准符号。

答案 1 :(得分:0)

您正在寻找left join

SELECT m.face, m.device_id,
       d.reading_time, d.reading
FROM master m LEFT JOIN
     detail d
     ON d.device_id = m.device_id 
WHERE m.account_number = 100050300;

注意:

  • 始终使用明确的JOIN语法。简单的规则:从不FROM子句中使用逗号。
  • LEFT JOIN很容易理解。无论ON的计算结果是true,false还是NULL,它都会将所有行保留在第一个表中。不匹配的行具有NULL值。您希望将所有行保留在master(受where条件限制),因此它会先行。
  • 我在您的查询中修复了表别名。