我有两个表,运行时我存储运行时和临时存储温度的地方。 我想在所有运行时获取所有项目的温度。 如果在运行时遗漏了某个项目,我希望它显示如下。
表格运行时
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 <--
我不管理的部分是获得最后一行。
干杯
答案 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