【问题标题】:SQL Select rows and join only on MAX() valueSQL 选择行并仅在 MAX() 值上连接
【发布时间】:2017-08-10 18:05:56
【问题描述】:

我有两张桌子 - Boxes 和 Items:

Boxes
Id|Name
 1|Box1
 2|Box2
 3|Box3

Items
Id|Size|Box
 1|2   |1
 2|3   |1
 3|2   |2
 4|5   |2

我需要从 Boxes 中获取所有项目,并从 Items 中获取 MAX(Size)。如果Items中没有对应的Size,Size应该为0。

结果应该是这样的:

Result
Id|Name|Size
 1|Box1|3
 2|Box2|5
 3|Box3|0

根据我的阅读,有很多方法,例如子查询或使用 GROUP BY(显然,MSSQL 不允许这样做)。可以跨任何(或至少)大多数 RDBMS 工作的最有效方法是什么?

【问题讨论】:

    标签: sql select join max


    【解决方案1】:
    SELECT A.ID,A.Name,COALESCE(MAX(Size),0)
    FROM Boxes AS A
    LEFT JOIN ITEMS AS B
    ON B.BOX = A.Id
    GROUP BY A.ID,A.Name
    

    【讨论】:

    【解决方案2】:

    我没有办法在 MSSQL 上对此进行测试,但根据我的经验,子查询是执行此类操作的最有效方法。

    select b.id, b.name, 
      (select max(i.size) from items i where i.box = b.id) as size 
    from boxes b;
    

    【讨论】:

      【解决方案3】:

      这里有几个解决这个问题的方法。 @LONG 的回答是最好的:

      declare @a table(
       ID INT,
       [Name] VARCHAR(20)
      )
      declare @b table(
       ID INT,
       Size INT,
       Box INT
      )
      
      INSERT @a VALUES(1,'Box 1'),(2,'Box 2'),(3, 'Box 3')
      INSERT @b VALUES(1,2,1),(2,3,1),(3,2,2),(4,5,2)
      
      select * from @a
      select * from @b
      
      select 
      A.ID,
      A.[Name],
      ISNULL(BB.MaxSize, 0)
      from @a A
      LEFT JOIN (SELECT Max(Size) AS MaxSize, Box FROM @b B 
      GROUP BY B.Box) BB ON A.ID = BB.Box
      
      
      SELECT A.ID,A.Name,COALESCE(MAX(Size),0)
      FROM @a AS A
      LEFT JOIN @b AS B
      ON B.Box = A.Id
      GROUP BY A.ID,A.Name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-11
        • 1970-01-01
        相关资源
        最近更新 更多