Usando l'ordine con distinto su un join (plsql)
-
28-10-2019 - |
Domanda
Ho scritto un join su alcune tabelle e ho ordinato i dati utilizzando due livelli di ordinazione, uno dei quali è la chiave principale di una tabella.
Ora, con questi dati ordinati, voglio quindi escludere eventuali duplicati dai miei dati usando una vista in linea e la clausola distinta - ed è qui che sto diventando sbalordito.
Mi sembra di essere in grado di ordinare i dati o distinti, ma mai entrambi allo stesso tempo. C'è un modo per aggirare questo o mi sono imbattuto nell'equivalente SQL del principio di incertezza?
Questo codice restituisce i dati ordinati, ma con i duplicati
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;
Questo codice rimuove i duplicati, ma perdo l'ordine ...
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
)
;
Se provo a includere 'Order by Ada_id' alla fine della selezione esterna, ottengo il messaggio di errore 'ORA-01791: non un'espressione selezionata' che mi sta facendo esissione !!
Nessuna soluzione corretta
Altri suggerimenti
Perché non includi ada_id
nei campi selezionati della query esterna?
;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
Sembra che ADA_ID non abbia senso nella query esterna. Hai rimosso tutti quei valori per ridurlo alla distinta sorgente_tab e source_col ...
Cosa ti aspetteresti che sia l'ordine?
Vuoi forse il minimo ADA_ID per ogni tabella e colonna impostata per essere il driver per l'ordine - (anche se il nome della tabella mi sembra appropriato)
Includi il minimo ADA_ID nella query interna (avrai bisogno di un gruppo per clausola), quindi fare riferimento a quella nella query esterna e ordinarlo su di essa.