2016-09-19 6 views
0

左結合で行ベースの条件を書き込む方法はありますか?左結合の行ベース条件

カラム条件に基づいていくつかの行が存在しない場合は、次の最初の行が必要です。私は以下の構造を持っている

create table Report 
(
    id int, 
    name varchar(10) 
) 

create table ReportData 
(
    report_id int references report(id), 
    flag bit, 
    path varchar(50) 
) 

insert into Report values (1, 'a'); 
insert into Report values (2, 'b'); 
insert into Report values (3, 'c'); 

insert into ReportData values (1, 0, 'xx'); 
insert into ReportData values (2, 0, 'yy'); 
insert into ReportData values (2, 1, 'yy'); 
insert into ReportData values (3, 1, 'zz'); 
insert into ReportData values (3, 1, 'mm'); 

私はあなたがこのためにROW_NUMBERを使用することができます

1 a 0 xx 
2 b 0 yy 
3 c 1 zz 
+0

をレポートテーブルに各IDの一意の行がありますか? –

+0

「列の条件に基づいて行が存在しない場合」とはどういう意味ですか?上記の例では? – GauravKP

答えて

1

のようないくつかの出力を必要とする:

;WITH ReportDate_Rn AS (
    SELECT report_id, flag, path, 
      ROW_NUMBER() OVER (PARTITION BY report_id ORDER BY path) AS rn 
    FROM ReportDate 
) 
SELECT t1.id, t1.name, t2.flag, t2.path 
FROM Report AS t1 
JOIN ReportDate_Rn AS t2 ON t1.id = t2.report_id AND t2.rn = 1 

上記のクエリが最初とみなし各レコードreport_id sシラミ、アルファベットが小さいものpathROW_NUMBER()ウィンドウ関数のORDER BY節を必要に応じて修正することができます。

0
SELECT id,name,flag,path 
FROM 
(

SELECT Report.id,Report.name,ReportData.flag,ReportData.path, 
     row_number() over(partition by ReportData.report_id order by flag) as rownum 
FROM Report 
JOIN ReportData on Report.id = ReportData.report_id 
) tmp 
WHERE tmp.rownum=1 
0

左のシンプルな代替は、あなたがこれを達成することができますrow_numner()を使用せずにROWIDとROWNUM

SELECT id, name, flag, path 
FROM report, reportdata 
WHERE reportdata.rowid = (SELECT rowid 
          FROM reportdata 
          WHERE id = report_id 
          AND rownum = 1); 
0

を使用して、参加します。

このSQL Fiddle

select r.id, r.name, d.flag, d.path from report r 
inner join reportdata d 
on r.id = d.report_id group by d.report_id 

PSを見てください:私は結果を信じていなかった - 私は、クエリを構築しました - select claused.report_idを使用し、それが働いていません。私はこのクエリが働いた理由:)

0

使用して、 BY パーティション得れば、この答えを更新します:

declare @Report AS table 
(
    id int, 
    name varchar(10) 
) 

declare @ReportData AS table 
(
    report_id int , 
    flag bit, 
    path varchar(50) 
) 

insert into @Report values (1, 'a'); 
insert into @Report values (2, 'b'); 
insert into @Report values (3, 'c'); 

insert into @ReportData values (1, 0, 'xx'); 
insert into @ReportData values (2, 0, 'yy'); 
insert into @ReportData values (2, 1, 'yy'); 
insert into @ReportData values (3, 1, 'zz'); 
insert into @ReportData values (3, 1, 'mm'); 

;WITH T AS 
(
    Select 
     R.id, 
     r.name, 
     RD.flag, 
     RD.path, 
     ROW_NUMBER() OVER(PARTITION BY R.id ORDER BY R.id) AS PartNo 
    FROM @Report R 
    LEFT JOIN @ReportData RD ON R.id=RD.report_id 
) 
SELECT 
    T.id, 
    T.name, 
    T.flag, 
    T.path 
FROM T WHERE T.PartNo=1