2015-04-24 2 views
1

Я пытаюсь отформатировать оператор select. Назначение указывает, что он должен быть отформатирован таким образом.SQL Oracle - отображение значений только один раз за столбец

У меня есть база данных о службе такси. Мне нужно составить представление с названием компании, именем пассажира и номером такси. Легко. Однако вывод указывает, что название компании должно появляться только один раз на выходе, в верхней части его собственной группы. Таким образом, у меня есть:

CREATE VIEW TAXITRIPS(COMPANYNAME, PASSENGERNAME, TAXI#) AS 
(SELECT COMPANY.NAME, BOOKING.NAME, VEHICLES.TAXI# 
FROM BOOKING JOIN VEHICLES ON BOOKING.TAXI# = VEHICLES.TAXI# 
RIGHT OUTER JOIN COMPANY ON VEHICLES.NAME = COMPANY.NAME); 

Правое внешнее соединение - это то, что компании, не имеющие регистрации, все еще отображаются. Если я теперь бежать:

SELECT * FROM TAXITRIPS ORDER BY COMPANYNAME ASC; 

Это даст мне что-то вроде

COMPANYNAME   PASSENGERNAME  TAXI# 
--------------------------------------------- 
ABC TAXIS   DAVE    192 
LEGION CABS 
PREMIER CABS   SHANE    2154 
PREMIER CABS   TIM     2169 
SILVER SERVICE  DAVE    18579 
SILVER SERVICE  TIM     18124 
SILVER SERVICE  AARON    18917 

Нет результатов для легиона кабин, все поля отображаются, и так далее. Спецификация присваивания говорит, что она должна выглядеть так.

COMPANYNAME   PASSENGERNAME  TAXI# 
--------------------------------------------- 
ABC TAXIS   DAVE    192 
LEGION CABS 
PREMIER CABS   SHANE    2154 
        TIM     2169 
SILVER SERVICE  DAVE    18579 
        TIM     18124 
        AARON    18917 

Название компании должно отображаться только в его первом ряду. DISTINCT не помогает. Любой совет?

+2

Почему ваш вопрос с тегом «SQL Server», но заголовок говорит «Oracle»? –

+0

Потому что я не знаю, что я делаю, если честно. – ben

+0

. , Я предполагаю, что вы используете Oracle. Программное обеспечение, которое вы используете, должно быть в тегах. –

ответ

6

Обычно вы делаете это на уровне приложения, потому что результирующий набор зависит от упорядочения строк - это плохо в SQL.

Но вы можете сделать это, как:

SELECT (CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.NAME ORDER BY v.TAXI#) = 1 
      THEN c.NAME 
     END) as CompanyName, b.NAME, v.TAXI# 
FROM COMPANY c LEFT JOIN 
    VEHICLES v 
    ON v.NAME = c.NAME LEFT JOIN 
    BOOKING b 
    ON b.TAXI# = v.FLIGHT# 
ORDER BY c.name, v.taxi#; 

Примечание: Я переставил join с, чтобы быть LEFT JOIN s. Большинство людей считают, что это проще, чем RIGHT JOIN.

+0

Dang еще одно мощное использование над разделом, строка num и case case. Но я согласен ... обычно делается на прикладном уровне. +1 – xQbert

+1

Этот запрос должен иметь порядок, так как есть вероятность, что строки не будут отображаться в ожидаемом порядке. – Boneist

+0

@Boneist. , , Я действительно не знаю, обращает внимание Oracle на «порядок» в представлении. В общем, при использовании представлений советуем сделать заказ в запросе, ссылающемся на представление. В качестве примера, 'order by' явно не разрешен в представлениях SQL Server, если в представлении также нет' top' и не требуется ANSI. –

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