在连接上使用不同的Order By(PLSQL)

时间:2012-02-20 16:27:55

标签: sql sql-order-by distinct inline-view

我已经在一些表上编写了一个连接,并且我已经使用两个级别的顺序对数据进行了排序 - 其中一个是一个表的主键。

现在,根据这些数据排序,我想使用内联视图和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-01791:不是一个SELECTed表达式”,这让我很生气!

3 个答案:

答案 0 :(得分:0)

为什么不在外部查询的选定字段中包含ada_id

答案 1 :(得分:0)

;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

答案 2 :(得分:0)

似乎ada_id在外部查询中没有意义。 你删除了所有这些值,将其归结为不同的source_tab和source_col ......

您对订单的期望是什么?

您希望每个表和列的最小ada_id设置为订单的驱动程序 - (尽管表名对我来说似乎合适)

在内部查询中包含最小的ada_id(您需要group by子句) 然后在外部查询中引用它并对其进行排序。