Создание чистого представления Oracle SQL без повторения одной и той же информации в каждой строке - PullRequest
0 голосов
/ 04 июня 2018

Я создал представление Oracle SQL, которое выглядит следующим образом:

John Strange  |  Carnaby Street, S9 8EU | CS5 Degree | Sociology   
John Strange  |  Carnaby Street, S9 8EU | CS5 Degree | Religious Studies  
John Strange  |  Carnaby Street, S9 8EU | CS5 Degree | Environmental Studies  
John Strange  |  Carnaby Street, S9 8EU | CS5 Degree | Management  
John Strange  |  Carnaby Street, S9 8EU | CS5 Degree | Business Intelligence

Что бы вы порекомендовали использовать для отображения имени, адреса и имени степени только один раз?Я использовал DISTINCT, но он не работает.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

В качестве альтернативы, вместо удаления четвертого столбца, вы можете отобразить список значений.Вы можете использовать LISTAGG для этого, хотя имейте в виду, что он имеет ограничение в 4000 символов.

select full_name, address, program, 
    listagg(course, ', ') within group (order by course)
from my_view
group by full_name, address, program;
0 голосов
/ 04 июня 2018

http://sqlfiddle.com/#!4/0c113/3/0

Вы можете определить свой запрос на просмотр следующим образом -

Настройка -

CREATE TABLE Table1
    (Name varchar2(12), Address varchar2(22), Degree varchar2(10), Subject varchar2(21))
;

INSERT ALL 
    INTO Table1 (Name, Address, Degree, Subject)
         VALUES ('John Strange', 'Carnaby Street, S9 8EU', 'CS5 Degree', 'Sociology')
    INTO Table1 (Name, Address, Degree, Subject)
         VALUES ('John Strange', 'Carnaby Street, S9 8EU', 'CS5 Degree', 'Religious Studies')
    INTO Table1 (Name, Address, Degree, Subject)
         VALUES ('John Strange', 'Carnaby Street, S9 8EU', 'CS5 Degree', 'Environmental Studies')
    INTO Table1 (Name, Address, Degree, Subject)
         VALUES ('John Strange', 'Carnaby Street, S9 8EU', 'CS5 Degree', 'Management')
    INTO Table1 (Name, Address, Degree, Subject)
         VALUES ('John Strange', 'Carnaby Street, S9 8EU', 'CS5 Degree', 'Business Intelligence')
SELECT * FROM dual
;

Запрос -

select name, address, degree, listagg(Subject,' , ') within group (order by subject) as Subjects
from Table1
group by name, address, degree

Вывод-

NAME            ADDRESS                 DEGREE      SUBJECTS
John Strange    Carnaby Street, S9 8EU  CS5 Degree  Business Intelligence , Environmental Studies , Management , Religious Studies , Sociology
0 голосов
/ 04 июня 2018

Почему это не работает, вы просто исключаете другие столбцы, потому что distinct будет применяться ко всем столбцам / выражениям, которые у вас есть.

select distinct displayname, address, degree 
from <view> v1;

Например, последний столбец имеет другое значение.таким образом, это не будет работать, если вы включили в оператор select с distinct.

...