2012-02-20 76 views
0

我已經在某些表上寫了一個連接,並且我已經使用兩個級別的排序來訂購數據 - 其中一個是一個表的主鍵。在連接上使用排序(PLSQL)

現在,在對這些數據進行排序後,我想用排列視圖和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表達式',這真讓我感到厭煩!

回答

0

爲什麼在外部查詢的選定字段中不包括ada_id

+0

ada_id是一個主鍵,所以每個記錄都是唯一的(這會使我的DISTINCT子句無效)。 我原以爲我可以在外部查詢中包含「ORDER BY ada_id」,但正如我所說 - 它會返回一個錯誤:S – TommyWylde 2012-02-20 16:41:32

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 
0

似乎ada_id在外部查詢中沒有意義。 你已經刪除了所有這些值,將其歸結爲不同的source_tab和source_col ...

你會期望順序是什麼?

你想也許每個表和列設置爲訂單的驅動器的最小ada_id - (雖然表名似乎是適當的我)

包括在內部查詢的最低ada_id(你會需要一個group by子句) 然後在外部查詢中引用它並對其進行排序。