Использование Order By с Distinct при объединении (PLSQL)
Я написал объединение для некоторых таблиц и упорядочил данные, используя два уровня упорядочения, один из которых является первичным ключом одной таблицы.
Теперь, когда эти данные отсортированы, я хочу затем исключить любые дубликаты из моих данных, используя встроенное представление и предложение 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 ответа
Кажется, что ada_id не имеет смысла во внешнем запросе. Вы удалили все эти значения, чтобы свести их к разным source_tab и source_col...
что вы ожидаете от заказа?
Вы хотите, чтобы минимальный ada_id для каждой таблицы и столбца был драйвером для заказа (хотя название таблицы мне кажется подходящим)
включите минимальный ada_id во внутренний запрос (вам понадобится предложение group by), затем укажите ссылку на него во внешнем запросе и выполните сортировку по нему.
Почему бы вам не включить ada_id
на выбранных полях внешнего запроса?
;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