2016-10-24 4 views
0

Я использовал listagg для составления списка и списка книг вместе с именем дополнительной книги.Удалить повторяющиеся значения из списка в оракуле

SELECT DISTINCT SUBSTR(LISTAGG(',-'||B1.BOOK_NO||','||B1.BOOK_NAME||','||A.AUTHOR_NAME||',-'||B2.BOOK_NO||','||B2.BOOK_NAME) WITHIN GROUP (ORDER BY B2.BOOK_NO),2) 
FROM BOOK_LIST B1 
INNER JOIN AUTHORS A ON A.AUTHOR_NO=B1.AUTHOR_NO 
INNER JOIN SUPPLEMENTARY B2 ON B2.BOOK_NO = B1.BOOK_SUP_NO 
WHERE B1.SEQ = 123; 

Но поскольку количество дополнительных книг больше, я получаю название основной книги повторно.

Есть ли способ удалить дублирующее имя и номер главной книги.

Мой Ouput подобен этому

-99,Anders Carlson ,-109,John Stuart,-99,Anders Carlson ,-47,James Anderson

Здесь значение 99 повторяется я хочу только один 99.

Желаемая Выход:

-99,Anders Carlson ,-109,John Stuart,-47,James Anderson

данных DB:

Book_list:

NO | MAIN_BOOK_NO | MAIN_BOOK_NAME | BOOK_SUP_NO | AUTHOR_NO 
1 | 12  | xyz   | 5   | 2 
2 | 22  | abc   | 7   | 4 

Авторы:

NO | AUTHOR_NO | AUTHOR_NAME 
1 | 2  | Alex 
2 | 3  | Leonard 
3 | 4  | Benjamin 

Дополнительный:

NO | BOOK_NO | BOOK_NAME 
1 | 5  | ABC 
2 | 5  | XYZ 
3 | 7  | LMN 
4 | 7  | DEF 
5 | 7  | NEW 

Выходной сигнал должен быть как

  NAME 
12,xyz,Alex,-5,ABC,-5,XYZ 
22,abc,Benjamin,-7,LMN,-7,DEF,-7,NEW 

Аналогично для всех данных в таблице

+0

Пожалуйста, разместите несколько примеров данных и желаемого результата. – Aleksej

+0

@Aleksej Я добавил свой результат и желаемый результат, пожалуйста, проверьте –

+0

Если у вас есть книга со многими дополнениями, как выбрать тот, который нужно показать? У вас есть заказ, вы хотите случайный? – Aleksej

ответ

1

Если я вас правильно понимаю, что вам нужно добавить в список дополнительных книг в главной книге, так что вы на самом деле после того, как что-то вроде:

SELECT B1.MAIN_BOOK_NO||','||B1.MAIN_BOOK_NAME||',-'|| 
     LISTAGG(B2.BOOK_NO||','||B2.BOOK_NAME, ',-') WITHIN GROUP (ORDER BY B2.BOOK_NO) 
FROM BOOK_LIST B1 
     INNER JOIN AUTHORS A ON A.AUTHOR_NO=B1.AUTHOR_NO 
     INNER JOIN SUPPLEMENTARY B2 ON B2.BOOK_NO = B1.BOOK_SUP_NO 
WHERE B1.SEQ = 123 
GROUP BY B1.MAIN_BOOK_NO, B1.MAIN_BOOK_NAME; 
+0

Я получаю ошибку «не групповая функция группы» –

+0

- это b1.seq первичный ключ для таблицы book_list? – Boneist

+0

Да, его первичный ключ –

0

Смотрите, если это работает

select T1.MAIN_BOOK_NO, T11.MAIN_BOOK_NAME, LISTAGG(',-'||',-'||T1.BOOK_NO||','||T1.BOOK_NAME) WITHIN GROUP (order by T1.BOOK_NO) 
from 
(
SELECT B1.MAIN_BOOK_NO, B1.MAIN_BOOK_NAME, B2.BOOK_NO, B2.BOOK_NAME 
FROM BOOK_LIST B1 
INNER JOIN AUTHORS A ON A.AUTHOR_NO=B1.AUTHOR_NO 
INNER JOIN SUPPLEMENTARY B2 ON B2.BOOK_NO = B1.BOOK_SUP_NO 
WHERE B1.SEQ = 123 
group by B1.MAIN_BOOK_NO, B1.MAIN_BOOK_NAME, B2.BOOK_NO, B2.BOOK_NAME 
order by B2.BOOK_NO 
) T1 
group by T1.MAIN_BOOK_NO, T1.MAIN_BOOK_NAME; 

 Смежные вопросы

  • Нет связанных вопросов^_^