En utilisant Trier par avec Distinct sur une jointure (PLSQL)
-
28-10-2019 - |
Question
J'ai écrit une jointure sur certaines tables et j'ai ordonné les données en utilisant deux niveaux de commande -. Dont une est la clé primaire d'une table
Maintenant, avec ces données triées je veux exclure ensuite les doublons de mes données en utilisant une vue et la clause DISTINCT en ligne - et c'est d'où je viens décollée
.Je semble pouvoir soit trier les données ou distinctes, mais jamais les deux en même temps. Est-il un moyen de contourner cela ou ai-je tombé sur l'équivalent SQL du principe d'incertitude?
Ce code renvoie les données triées, mais avec des doublons
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;
Ce code supprime les doublons, mais je perds l'ordre ...
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
)
;
Si je tente et inclueront « ORDER BY ada_id » à la fin de la sélection externe, je reçois le message d'erreur « ORA-01791: pas une expression selected » qui me exaspérant !!
Pas de solution correcte
Autres conseils
Pourquoi ne pas inclure ada_id
les champs sélectionnés de la requête externe?
;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
il semble que le ada_id n'a pas de sens dans la requête externe. vous avez supprimé toutes ces valeurs pour faire bouillir jusqu'à la source_tab distincte et source_col ...
qu'est-ce que vous attendez de l'ordre d'être?
vous voulez peut-être le ada_id minimum pour chaque ensemble de table et de la colonne pour être le pilote de l'ordre - (bien que le nom de la table me semble approprié)
inclure le ada_id minimum dans la requête interne (vous aurez besoin d'un groupe par article) alors que référence dans la requête externe et trier dessus.