我有一个SQL查询问题。两张桌子:
位置
lid State
--- -----
1 MI
2 FL
3 CA
时间
tid lid
a 1
b 1
c 2
d 2
e 3
f 3
现在我想连接这两个表。如果我这样做:
select l.lid, l.state, t.tid
from location l, time t
where l.lid=t.lid
然后它会给我这个结果:
lid state tid
--- ----- ---
1 MI a
1 MI b
2 FL c
2 FL d
3 CA e
3 CA f
我希望得到这样的结果,而不是得到这个结果:
lid state tid1 tid2
--- ----- ---- ----
1 MI a b
2 FL c d
3 CA e f
我应该如何编写查询?
另外,假设在时间表中,每个盖子都会有正好两个记录。
答案 0 :(得分:2)
您尝试的问题是它不对结果进行分组,GROUP BY子句只能与聚合函数一起使用。
这可以通过这样的方式轻松完成
select location.lid as [lid],
location.state as [state],
min(time.tid) as [tid1],
max(time.tid)as [tid2]
from
location,time
where
location.lid = time.lid
group by
location.state,location.lid;
查询的作用是选择盖子和状态为正常但选择min tid1和最大tid2。因为只有两个结果,一个是最大值,第二个是最小值。
(查询只选择最大值和最小值。如果有三个值,查询仍然只显示两个结果。)
最后,结果按位置ID和州名称分组。
看到它在这里工作SqlFiddle
答案 1 :(得分:1)
SELECT
l.lid, l.state,
MIN(t.tid) AS tid1,
MAX(t.tid) AS tid2
FROM
location AS l
JOIN
time AS t
ON l.lid = t.lid
GROUP BY
l.lid, l.state ;
答案 2 :(得分:-1)
我有自己的解决方案来解决这个问题。
只需连接两个时间表,然后使用大于的运算符。
select * from
location l, time t1, time t2
where l.lid=t1.lid and l.lid=t2.lid and t1.tid<t2.tid