【问题标题】:sql query for connecting two tables [duplicate]用于连接两个表的sql查询[重复]
【发布时间】:2012-07-18 17:39:08
【问题描述】:

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

我应该如何编写查询?

另外,假设在 Time 表中,每个盖子会有正好两条记录

【问题讨论】:

  • 只有两个 tid 匹配吗?或者它可以是任何数字?
  • Jodaka 问题的答案将决定您的问题的答案,JohnnySun。
  • 总是正好有 2 个匹配?从来不只有一个?
  • 你需要停止使用隐式连接,它们是一种非常糟糕的做法和 SQL Anitpattern。它们在 20 年前被显式联接所取代,是时候停止使用这种 u=过时且糟糕的做法了。

标签: sql


【解决方案1】:

您正在尝试的问题是它没有对结果进行分组,并且 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。因为只有两个结果,一个是最大的,第二个是最小的。

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

最后,结果按位置 ID 和州名分组。

看到它在这里工作SqlFiddle

【讨论】:

    【解决方案2】:
    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 ;
    

    【讨论】:

      【解决方案3】:

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

      只需连接两个time表并使用大于运算符。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2016-05-27
        • 2017-07-05
        • 2020-11-10
        • 2016-01-12
        • 2013-10-16
        相关资源
        最近更新 更多