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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top