用于连接两个表的SQL查询

时间:2012-07-19 13:59:13

标签: sql

  

可能重复:
  Simple SQL Select from 2 Tables (What is a Join?)

我有一个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

我应该如何编写查询?

另外,假设在时间表中,每个盖子都会有正好两个记录

3 个答案:

答案 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