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是我需要它的原因。
答案 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
条件限制),因此它会先行。