Usando el orden por con distinto en una unión (PLSQL)
-
28-10-2019 - |
Pregunta
He escrito una unión en algunas tablas y he ordenado los datos utilizando dos niveles de pedido, uno de los cuales es la clave principal de una tabla.
Ahora, con estos datos ordenados, quiero excluir cualquier duplicado de mis datos utilizando una vista en línea y la cláusula distinta, y aquí es donde me estoy despegando.
Parece que puedo clasificar los datos o distintos, pero nunca al mismo tiempo. ¿Hay alguna manera de evitar esto o me he topado con el equivalente SQL del principio de incertidumbre?
Este código devuelve los datos ordenados, pero con duplicados
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;
Este código elimina los duplicados, pero pierdo el pedido ...
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 intento incluir 'Order by ADA_ID' al final de la selección externa, recibo el mensaje de error 'ORA-01791: ¡No una expresión seleccionada' que me está enfureciendo!
No hay solución correcta
Otros consejos
¿Por qué no incluyes ada_id
¿En los campos seleccionados de la consulta externa?
;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
Parece que el ADA_ID no tiene sentido en la consulta externa. Has eliminado todos esos valores para reducirlo a Distint Source_tab y Source_col ...
¿Qué esperarías que sea la orden?
Desea que quizás el mínimo de ADA_ID para cada tabla y columna se ajuste al controlador para el pedido, (aunque el nombre de la tabla me parece apropiado)
Incluya el mínimo de ADA_ID en la consulta interna (necesitará un grupo por cláusula) y luego haga referencia a eso en la consulta externa y ordene en ella.