代码之家  ›  专栏  ›  技术社区  ›  Romain Linsolas

创建一个SQL查询以从两个表中检索数据

  •  2
  • Romain Linsolas  · 技术社区  · 15 年前

    我有两张桌子:

    T_STOCK :主键是 id , seller 以及其他一些领域 a b . T_FLOW :主键是( 身份证件 + startdate )和其他一些字段,例如 c d .

    我想要一个返回每个记录的所有列的查询 TS股 关于一个特定的 卖方 ,但用列完成( startDate , C D )来自 Ty-流 表。

    两者之间的关系 TS股 Ty-流 是基于 身份证件 属性。 每次中存在具有特定ID的记录时 TS股 ,中至少存在一条记录 Ty-流 为了这个ID。

    但是,可能会有多个记录存在于 Ty-流 . 在这种情况下,我必须只考虑 最近一个 (即 max(startDate) )

    换句话说,如果我们有下表的内容:

    +---------------------+
    |       T_STOCK       |
    +----+--------+---+---+
    | ID | SELLER | a | b |
    +----+--------+---+---+
    | 01 | foobar | 1 | 2 |
    +----+--------+---+---+
    | 02 | foobar | 3 | 4 |
    +----+--------+---+---+
    | 03 | foobar | 5 | 6 |
    +----+--------+---+---+
    
    +---------------------------+
    |           T_FLOW          |
    +----+------------+----+----+
    | ID |  StartDate |  c |  d |
    +----+------------+----+----+
    | 01 | 01/01/2010 |  7 |  8 |
    +----+------------+----+----+
    | 02 | 01/01/2010 |  9 | 10 |
    +----+------------+----+----+
    | 02 | 07/01/2010 | 11 | 12 |
    +----+------------+----+----+
    | 03 | 03/01/2010 | 13 | 14 |
    +----+------------+----+----+
    | 03 | 05/01/2010 | 15 | 16 |
    +----+------------+----+----+
    

    查询结果必须是:

    +----+--------+---+---+------------+----+----+
    | ID | SELLER | a | b |  startDate |  c |  d |
    +----+--------+---+---+------------+----+----+
    | 01 | foobar | 1 | 2 | 01/01/2010 |  7 |  8 |
    +----+--------+---+---+------------+----+----+
    | 02 | foobar | 3 | 4 | 03/01/2010 | 11 | 12 |
    +----+--------+---+---+------------+----+----+
    | 03 | foobar | 5 | 6 | 01/01/2010 | 15 | 16 |
    +----+--------+---+---+------------+----+----+
    

    那我该如何写我的查询呢?

    4 回复  |  直到 12 年前
        1
  •  3
  •   Quassnoi    15 年前
    SELECT  *
    FROM    t_stock s
    JOIN    (
            SELECT  f.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY startDate DESC) AS rn
            FROM    t_flow f
            ) f
    ON      f.id = s.id
            AND f.rn = 1
    

    以下是不使用分析函数的解决方案:

    SELECT  *
    FROM    t_stock s
    JOIN    t_flow f
    ON      (f.id, f.startDate) =
            (
            SELECT  id, MAX(startDate)
            FROM    t_flow fi
            WHERE   fi.id = s.id
            GROUP BY
                    id
            )
    
        2
  •  1
  •   Community dbr    7 年前

    你可以通过分析得到最新的流量记录, as shown by Quassnoi 或使用:

    select id, max(startdate) last_start_date from t_flow group by id;
    

    然后,您可以将它与您的t_stock表连接起来-类似于:

    select
        s.*,
        f.*
    from
        t_stock s
            inner join t_flow f on
                    f.id = s.id
                and (f.id, f.startdate) in
                    (
                    select
                        id,
                        max(startdate) laststartdate
                    from
                        t_flow
                    group by
                        id
                    )
    
        3
  •  0
  •   Jeffrey Kemp    15 年前
    SELECT  DISTINCT
            s.*
           ,FIRST_VALUE(f.startdate)
            OVER (PARTITION BY f.id ORDER BY f.startdate DESC) startdate
           ,FIRST_VALUE(f.c)
            OVER (PARTITION BY f.id ORDER BY f.startdate DESC) c
           ,FIRST_VALUE(f.d)
            OVER (PARTITION BY f.id ORDER BY f.startdate DESC) d
    FROM    t_stock s, t_flow f
    WHERE   f.id = s.id
    
        4
  •  0
  •   Harry Joy    12 年前
    select id, max(startdate) last_start_date from t_flow group by id;
    

    然后你可以和你的 T_STOCK 表,类似于:

    select s.*, f.* from t_stock s inner join t_flow f on f.id = s.id
    and (f.id, f.startdate) in (select id, max(startdate) laststartdate
                    from t_flow group by id)