Это действительно проблема форматирования, которая лучше всего обрабатывается клиентом . Например, в 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. Узнайте больше.
Я использовал BREAK
в качестве примера правильного способа ведения дел, потому что он чистый и правильно реализует разделение интересов. Если вы используете другой клиент, вам нужно будет использовать его возможности форматирования. Можно настроить SQL (см. Ниже), но это снижает полезность запроса, потому что мы не можем повторно использовать запрос в других местах, которые не хотят подавлять дублированные значения.
В любом случае, вот одно решение, которое использует аналитическую функцию ROW_NUMBER()
во встроенном представлении.
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 будет переменным.