1

この質問は SO で何度も尋ねられましたが、すべての回答は SQL 2005 以降に関するもので (例: OUTER APPLY)、まだ SQL 2000 を使用しています (企業の理由で複雑すぎてここに入ることができません!)。

私は のテーブルThingsと のテーブルをWidgets0 対多の関係で持っています:

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 を使用して実現できますか?

4

1 に答える 1

2

(ThingId, WidgetId)組み合わせが table で一意の場合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 ;
于 2012-11-28T11:23:33.800 に答える