我在一些表上写了一个联接,并使用两个级别的排序对数据进行排序,其中一个级别是一个表的主键。
现在,对这些数据进行排序后,我想使用内联视图和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-0791:not a SELECTed expression",这让我很生气!!
为什么不在外部查询的选定字段中包含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
似乎ada_id在外部查询中没有意义。您已经删除了所有这些值,将其归结为不同的sourcetab和sourcecol。。。
你希望订单是什么?
您可能希望每个表和列集的最小ada_id作为订单的驱动程序-(尽管表名对我来说似乎很合适)
在内部查询中包含最小ada_id(您需要一个groupby子句)然后在外部查询中引用它并对其进行排序。