繁体   English   中英

SQL 2000 Left Join Top 1 of 0 to many关系

[英]SQL 2000 Left Join Top 1 of 0 to many relationship

这个问题在 SO 上被问过多次,但所有的答案都是指 SQL 2005 或更高版本(例如OUTER APPLY ),我们仍在使用 SQL 2000(由于公司原因太复杂,无法进入这里!)

我有一个Things表和一个具有 0 到多关系的Widgets表:

CREATE TABLE Things ( ThingId INT, ThingName VARCHAR(50) )

CREATE TABLE Widgets ( WidgetId INT, ThingId INT, WidgetName VARCHAR(50) )

INSERT INTO Things VALUES ( 1, 'Thing 1' )

INSERT INTO Things VALUES ( 2, 'Thing 2' )

INSERT INTO Things VALUES ( 3, 'Thing 3' )

INSERT INTO Widgets VALUES ( 1, 2, 'Thing 2 Widget 1' )

INSERT INTO Widgets VALUES ( 2, 2, 'Thing 2 Widget 2' )

INSERT INTO Widgets VALUES ( 3, 3, 'Thing 3 Widget 1' )

标准的LEFT OUTER JOIN返回预期的 4 行

SELECT * FROM Things t LEFT OUTER JOIN Widgets w ON t.ThingId = w.ThingId

 ThingId | ThingName | WidgetId | ThingId | WidgetName       
---------+-----------+----------+---------+------------------
 1       | Thing 1   | NULL     | NULL    | NULL             
 2       | Thing 2   | 1        | 2       | Thing 2 Widget 1 
 2       | Thing 2   | 2        | 2       | Thing 2 Widget 2 
 3       | Thing 3   | 3        | 3       | Thing 3 Widget 1 

但是,我只想要每个事物的最新小部件,即:

 ThingId | ThingName | WidgetId | ThingId | WidgetName       
---------+-----------+----------+---------+------------------
 1       | Thing 1   | NULL     | NULL    | NULL             
 2       | Thing 2   | 2        | 2       | Thing 2 Widget 2 
 3       | Thing 3   | 3        | 3       | Thing 3 Widget 1 

我的出发点是:

SELECT * FROM Things t LEFT OUTER JOIN (SELECT TOP 1 * FROM Widgets subw WHERE subw.ThingId = t.ThingId ORDER BY subw.WidgetId DESC) w ON t.ThingId = w.ThingId

但这无效,因为子查询中不存在父t.ThingId

这可以使用 SQL 2000 实现吗?

如果(ThingId, WidgetId)组合在表Widgets是唯一的,那么这将正常工作:

SELECT t.*, w.* 
FROM 
    dbo.Things AS t 
  LEFT OUTER JOIN 
      ( SELECT ThingId, MAX(WidgetId) AS WidgetId 
        FROM dbo.Widgets 
        GROUP BY ThingId
      ) AS 
    subw
      ON  subw.ThingId = t.ThingId
  LEFT OUTER JOIN
    dbo.Widgets AS w
      ON  w.ThingId = subw.ThingId
      AND w.WidgetId = subw.WidgetId ;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM