2012-02-20 6 views
0

いくつかのテーブルに結合を作成し、2つのレベルの順序付けを使用してデータを注文しました。その1つは1つのテーブルの主キーです。OrderをBy Joinで使用する(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:SELECTされた式ではない」が表示されます。

答えて

0

外部クエリの選択したフィールドにada_idを含めるのはなぜですか?

+0

ada_idは主キーであるため、すべてのレコードが一意です(これにより、DISTINCT句が無効になります)。 外部クエリに「ORDER BY ada_id」を含めることができると思ったでしょうが、私が言うように、エラーを返します。S – TommyWylde

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節が必要です) 外部のクエリでそれを参照してソートしてください。

関連する問題