【问题标题】:Using Order By with Distinct on a Join (PLSQL)在连接上使用 Order By 和 Distinct (PLSQL)
【发布时间】:2012-03-10 23:57:07
【问题描述】:

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

现在,对这些数据进行排序后,我想使用内联视图和 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: not a SELECTed expression”,这让我很生气!!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • ada_id 是主键,因此每条记录都是唯一的(这将使我的 DISTINCT 子句无效)。我原以为我可以在外部查询中包含“ORDER BY ada_id”,但正如我所说 - 它返回一个错误:S
    【解决方案2】:
    ;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
    

    【讨论】:

      【解决方案3】:

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

      您希望订单是什么?

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多