0

いくつかのテーブルに結合を記述し、2つのレベルの順序付けを使用してデータを順序付けました。そのうちの1つは、1つのテーブルの主キーです。

ここで、このデータを並べ替えて、インラインビューと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
     )
;

外側の選択の最後に「ORDERBYada_id」を含めようとすると、「ORA-01791:選択された式ではありません」というエラーメッセージが表示され、腹立たしくなります。

4

3 に答える 3

0

ada_id外側のクエリの選択したフィールドに含めてみませんか?

于 2012-02-20T16:35:19.240 に答える
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
于 2012-02-20T16:39:24.667 に答える
0

外側のクエリでは ada_id は意味がないようです。これらの値をすべて削除して、個別の source_tab と source_col にまとめました...

順番はどうなると思いますか?

おそらく、各テーブルと列セットの最小ada_idを注文のドライバーにする必要があります-(テーブル名は私には適切に思えますが)

内側のクエリに最小の ada_id を含め (group by 句が必要です)、それを外側のクエリで参照して並べ替えます。

于 2012-02-20T16:48:30.943 に答える