sql join - 包括不存在的行

时间:2014-04-04 12:32:29

标签: mysql sql

我有两个表,运行时我存储运行时和临时存储温度的地方。 我想在所有运行时获取所有项目的温度。 如果在运行时遗漏了某个项目,我希望它显示如下。

表格运行时

runtimeId | time
    1     | 2014-04-02 12:00:00
    2     | 2014-04-03 12:00:00

表格温度

temps | itemId | runtimeId
 10   |    1   |     1
 20   |    2   |     1
 11   |    1   |     2

通缉结果

runtimeId | time                | temps | itemId 
    1     | 2014-04-02 12:00:00 |   10  |   1
    1     | 2014-04-02 12:00:00 |   20  |   2
    2     | 2014-04-03 12:00:00 |   11  |   1
    2     | 2014-04-02 12:00:00 | NULL  |   2     <-- 

我不管理的部分是获得最后一行。

干杯

4 个答案:

答案 0 :(得分:2)

左连接将显示temps表中的所有记录以及运行时表的记录。

select
  *
from
  runtimes rt
  left join temps t on rt.runtimeId = t.runtimeId

您已表明要查看与itemId匹配的runtimeId 2。

然而,没有任何东西以这种方式加入你的数据,因此用箭头表示的2将为空。

您的结果将是:

runtimeId | time                | temps | itemId 
    1     | 2014-04-02 12:00:00 |   10  |   1
    1     | 2014-04-02 12:00:00 |   20  |   2
    2     | 2014-04-03 12:00:00 |   11  |   1
    2     | 2014-04-02 12:00:00 | NULL  |   NULL 

对于将显示itemId的笛卡尔积,无论其与另一个表的关系如何,请参阅@wumpz answer

答案 1 :(得分:1)

这是您的请求的解决方案:

select 
r.runtimeId,r.time,
(select temps from temps where runtimeId=r.runtimeId and itemId=data.itemId) as temps,
data.itemId
from 
runtimes r, 
(select distinct itemId from temps) data
order by r.runtimeid, data.itemid

它会给你想要的结果。

http://sqlfiddle.com/#!2/bc9e1/5

runtimeId | time                | temps | itemId 
    1     | 2014-04-02 12:00:00 |   10  |   1
    1     | 2014-04-02 12:00:00 |   20  |   2
    2     | 2014-04-03 12:00:00 |   11  |   1
    2     | 2014-04-02 12:00:00 | NULL  |   2    <<<<<  preserves itemId 2

特别是 runtimeId = 2和itemId = 2 结果行。它会选择所有runtimes的所有itemIds

我插入order by以获取您在请求中建议的排序。

答案 2 :(得分:0)

select r.runtimeId, r.time, t.temps, t.itemId from runtimes r
left outer join temps t on r.runtimeId = t.runtimeId

答案 3 :(得分:0)

尝试这个

select r.runtimeid,r.time, t.temps, t.itemId from runtime r left join temps t 
on r.runtimeid=t.runtimeid