【问题标题】:sql select from one to manysql从一对多中选择
【发布时间】:2016-02-15 06:40:02
【问题描述】:

我有两个表 A 和 B。A 和 B 之间存在一对多关系。A_Id 是外键。

         Create table A(Id int,Name varchar(50))
         create table B(Id int,A_Id int,Title varchar(50))

        insert into A Values(1,'name1');
        insert into A Values(2,'name2');
        insert into A Values(3,'name3');
        insert into A Values(4,'name4');

        insert into B Values(10,1,'title1');
        insert into B Values(11,1,'title5');
        insert into B Values(12,2,'title2');
        insert into B Values(13,2,'title6');
        insert into B Values(14,3,'title3');

我需要从表 A 中获取记录并从表 B 中获取匹配记录的标题 .如果表 B 中存在多个值,那么我需要选择具有最大 Id(table B) 的记录。

例如。表 B 中有两条记录 A_Id 1 。我需要从表 A 中选择一行,从表 B 中选择“title5”来匹配记录。

我试过了

     SELECT A.*, B.Title FROM A JOIN B ON A.Id = B.A_Id 

【问题讨论】:

    标签: sql join greatest-n-per-group


    【解决方案1】:

    您可以使用使用ROW_NUMBER 的派生表来枚举A_Id 分区内的记录:

    select A.Id, A.Name, B.Title
    from A
    inner join (
       select A_Id, Title,
              ROW_NUMBER() OVER (PARTITION BY A_Id ORDER BY Id DESC) AS rn
       from B
    ) AS B on A.Id = B.A_Id and B.rn = 1
    

    派生表BB.rn = 1的记录是其分区内Id值最大的记录,是INNER JOIN操作中使用的记录。

    Demo here

    【讨论】:

      【解决方案2】:

      试试这个

      sql Fiddle

      select A.Id, A.Name,b.title
      from A
      inner join (
         select A_Id, max(id) as id
         from B group by A_Id
      ) AS c on A.Id = c.A_Id 
      inner join b  on b.id = c.id 
      

      【讨论】:

        【解决方案3】:

        这可能不太有效,但肯定有效:)

        选择 a.*, b.title 从 a,b 其中 a.id=b.a_id and b.id = (select max(b.id) from b where A_Id=a.id)

        【讨论】:

          猜你喜欢
          • 2010-12-31
          • 2023-04-10
          • 1970-01-01
          • 2011-03-30
          • 1970-01-01
          • 2020-12-15
          • 1970-01-01
          • 1970-01-01
          • 2017-01-24
          相关资源
          最近更新 更多