OUTER JOIN と TOP10との組み合わせ

さまよい
2014-03-10 11:57 1678 1
テーブルAと LEFT OUTER JOIN するテーブルBがあり、
単にLEFT OUTER JOINすると、
レコードA01 レコードB01
レコードA01 レコードB02
レコードA01 レコードB03

のようにレコードBに対し、該当する同じレコードAが複数取得されます。

この状態でTOP10をかけると、テーブルAのTOP10が欲しいのに、
テーブルBも混じった数で取得されてしまいます。
(テーブルAは10レコード取得できない)

これをテーブルAのTOP10を取得して、それにJOINするテーブルBの数は問わない方法は可能でしょうか?

コメント

2014年 03月 10日 (12:37)
こんにちは。
イノ(inno)です。

下記のSQLを参考してみてください。
下記のSQLはTOP 5でしたのもですのでご参考ください。

-- テーブル作成
CREATE TABLE dbo.TempA
(
Data1 varchar(10)
, Data2 varchar(10)
)

CREATE TABLE dbo.TempB
(
Data1 varchar(10)
, Data2 varchar(10)
)


-- #### TempA テーブルにデータ登録
INSERT INTO dbo.TempA (Data1, Data2) VALUES ('A','AA1')
INSERT INTO dbo.TempA (Data1, Data2) VALUES ('B','AB1')
INSERT INTO dbo.TempA (Data1, Data2) VALUES ('C','AC1')
INSERT INTO dbo.TempA (Data1, Data2) VALUES ('D','AD1')
INSERT INTO dbo.TempA (Data1, Data2) VALUES ('E','AE1')
INSERT INTO dbo.TempA (Data1, Data2) VALUES ('F','AF1')
INSERT INTO dbo.TempA (Data1, Data2) VALUES ('G','AG1')

-- #### TempB テーブルにデータ登録
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('A','BA1')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('A','BA2')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('A','BA3')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('B','BB1')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('B','BB2')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('C','BC1')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('C','BC2')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('C','BC3')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('C','BC4')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('D','BD1')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('D','BD2')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('E','BE1')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('F','BF1')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('G','BG1')
INSERT INTO dbo.TempB (Data1, Data2) VALUES ('G','BG2')


-- #### 実行
SELECT *
FROM
( SELECT TOP 5 Data1, Data2
FROM dbo.TempA
ORDER BY Data1 ASC
) AS A LEFT OUTER JOIN dbo.TempB AS B
ON A.Data1 = B.Data1

-- #### 実行結果
Data1 Data2 Data1 Data2
A AA1 A BA1
A AA1 A BA2
A AA1 A BA3
B AB1 B BB1
B AB1 B BB2
C AC1 C BC1
C AC1 C BC2
C AC1 C BC3
C AC1 C BC4
D AD1 D BD1
D AD1 D BD2
E AE1 E BE1