Использование Order By с Distinct при объединении (PLSQL) - PullRequest
0 голосов
/ 20 февраля 2012

Я написал объединение для некоторых таблиц и упорядочил данные, используя два уровня упорядочения, один из которых является первичным ключом одной таблицы.

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

Мне кажется, что я могу либо отсортировать данные, либо отделить их, но никогда оба вв то же время.Есть ли способ обойти это или я наткнулся на SQL-эквивалент принципа неопределенности?

Этот код возвращает отсортированные данные, но с дубликатами

                SELECT 
                    ada.source_tab source_tab
                  , ada.source_col source_col
                  , ada.source_value source_value
                  , ada.ada_id ada_id
                FROM 
                    are_aud_data ada
                  , are_aud_exec_checks aec
                  , are_audit_elements ael
                WHERE 
                      aec.aec_id = ada.aec_id
                  AND ael.ano_id = aec.ano_id
                  AND aec.acn_id = 123456
                  AND ael.ael_type = 1
                ORDER BY 
                  CASE
                    WHEN source_tab = 'Tab type 1' THEN 1
                    WHEN source_tab = 'Tab type 2' THEN 2
                    ELSE 3
                  END
              ,ada.ada_id ASC;

Этот код удаляет дубликаты,но я теряю порядок ...

SELECT DISTINCT source_tab, source_col, source_value FROM (
                SELECT 
                    ada.source_tab
                  , ada.source_col source_col
                  , ada.source_value source_value
                  , ada.ada_id ada_id
                FROM 
                    are_aud_data ada
                  , are_aud_exec_checks aec
                  , are_audit_elements ael
                WHERE 
                      aec.aec_id = ada.aec_id
                  AND ael.ano_id = aec.ano_id
                  AND aec.acn_id = 123456
                  AND ael.ael_type = 1
                ORDER BY 
                  CASE
                    WHEN source_tab = 'Tab type 1' THEN 1
                    WHEN source_tab = 'Tab type 2' THEN 2
                    ELSE 3
                  END
              ,ada.ada_id ASC
     )
;

Если я попытаюсь включить 'ORDER BY ada_id' в конце внешнего выбора, я получаю сообщение об ошибке 'ORA-01791: не выражение SELECTed'что меня бесит !!

Ответы [ 3 ]

0 голосов
/ 20 февраля 2012
;WITH CTE AS
(
                  SELECT 
                    ada.source_tab source_tab
                  , ada.source_col source_col
                  , ada.source_value source_value
                  , ada.ada_id ada_id
                  , ROW_NUMBER() OVER (PARTITION BY [COLUMNS_YOU_WANT TO BE DISTINCT] 
                    ORDER BY [your_columns])  rn
                FROM 
                    are_aud_data ada
                  , are_aud_exec_checks aec
                  , are_audit_elements ael
                WHERE 
                      aec.aec_id = ada.aec_id
                  AND ael.ano_id = aec.ano_id
                  AND aec.acn_id = 356441
                  AND ael.ael_type = 1
                ORDER BY 
                  CASE
                    WHEN source_tab = 'Licensed Inventory' THEN 1
                    WHEN source_tab = 'CMDB'               THEN 2
                    ELSE 3
                  END
              ,ada.ada_id ASC
)
select * from CTE WHERE rn<2
0 голосов
/ 20 февраля 2012

кажется, что ada_id не имеет смысла во внешнем запросе.Вы удалили все эти значения, чтобы свести их к разным source_tab и source_col ...

какой бы вы ожидали, чтобы порядок был?

вы хотите минимальный ada_id для каждой таблицы истолбец, установленный в качестве драйвера для заказа - (хотя имя таблицы кажется мне подходящим)

включает минимальный ada_id во внутренний запрос (вам потребуется выражение group by), а затем ссылается на него во внешнем запросезапрос и сортировка по нему.

0 голосов
/ 20 февраля 2012

Почему бы вам не включить ada_id в выбранные поля внешнего запроса?

...