2012-07-19 88 views
0

可能重复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 

我应该怎么写查询?

此外,假设在时间表将有正好两个记录为每个盖。

+2

只会有两个匹配的tid吗?或者它可以是任何数字? – Jodaka 2012-07-19 14:00:40

+1

你可以这样做:http:// stackoverflow。com/questions/9472986/combine-rows-of-queried-by-unique-identifier – paul 2012-07-19 14:02:53

+0

Jodaka问题的答案将决定你的问题的答案,JohnnySun。 – Crontab 2012-07-19 14:03:31

回答

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

您所尝试的问题是,它没有对结果进行分组,而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; 

什么查询的作用是,它选择所述盖和状态为正常,而选择最小TID1和最大TID2来完成。由于只有两个结果,一个是最大值,另一个是最小值。

(该查询仅选择的最大和最小值,如果有三个valuse查询仍然将只显示两个结果。)

并在最后的结果是由位置ID和状态名称分组。

看到它在这里工作SqlFiddle

-1

我有我自己的版本解决这个问题。

只是连接两个时间表和使用大于运算符。

select * from 
location l, time t1, time t2 
where l.lid=t1.lid and l.lid=t2.lid and t1.tid<t2.tid