これは実際にはフォーマットの問題であり、クライアントが処理するのが最適です。たとえば、SQL*Plus ではBREAK
...を使用できます。
SQL> select t1.*, t2.* from t1, t2
2 /
A B C D C1
--- --- --- --- ----------
aaa bbb ccc ddd 111
aaa bbb ccc ddd 222
SQL> break on a on b on c on d
SQL> select t1.*, t2.* from t1, t2
2 /
A B C D C1
--- --- --- --- ----------
aaa bbb ccc ddd 111
222
SQL>
注:これ以上の情報がないため、デカルト積を選択しました。
編集
BREAK
は、行内の重複する列を抑制するSQL Plus コマンドです。SQL Plus クライアントでのみ機能します。ご想像のとおり、これは Oracle の SQL*Plus ユーザー ガイドで説明されています。 詳細をご覧ください。
私はBREAK
物事を行う適切な方法の例として使用しました。なぜなら、それはクリーンで、関心の分離を正しく実装しているからです。別のクライアントを使用している場合は、そのフォーマット機能を使用する必要があります。SQL を微調整することは可能ですが (以下を参照)、重複した値を抑制したくない他の場所でクエリを再利用できないため、クエリの有用性が低下します。
ROW_NUMBER()
とにかく、これはインライン ビューで分析関数を使用する 1 つのソリューションです。
SQL> select * from t1
2 /
A B C D ID
--- --- --- --- ----------
eee fff ggg hhh 1
aaa bbb ccc ddd 2
SQL> select * from t2
2 /
C1 ID
---------- ----------
333 2
111 1
222 2
444 2
SQL> select t1_id
2 , case when rn = 1 then a else null end as a
3 , t2_id
4 , c1
5 from (
6 select t1.id as t1_id
7 , row_number () over (partition by t1.id order by t2.c1) as rn
8 , t1.a
9 , t2.c1
10 , t2.id as t2_id
11 from t1, t2
12 where t1.id = t2.id
13 )
14 order by t1_id, rn
15 /
T1_ID A T2_ID C1
---------- --- ---------- ----------
1 eee 1 111
2 aaa 2 222
2 2 333
2 2 444
SQL>
を使用しないことにしましLAG()
た。これは、固定オフセットでのみ機能し、T2 の行数が可変になる可能性が高いためです。