You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Toad for Oracle v11.6按cc_orig唯一值提取单条数据的SQL实现

解决Oracle中类似PostgreSQL Distinct On的需求

针对你在Toad for Oracle 11.6里遇到的问题——需要对cc_orig的每个唯一值仅返回任意一条数据,而常规DISTINCT因为多字段组合无法满足单字段去重的需求,这里提供几种可行的SQL实现方案:

方案1:使用ROW_NUMBER()窗口函数(推荐)

这是最灵活的方案,既能满足"任意返回一条"的需求,后续如果需要指定返回规则(比如取最新交易记录)也能轻松调整:

SELECT cc_orig, cc_base, txn_orig, txn_base
FROM (
    SELECT 
        cc_orig, cc_base, txn_orig, txn_base,
        -- 按cc_orig分组,每组内随机分配行号(ORDER BY NULL让Oracle随机排序)
        ROW_NUMBER() OVER (PARTITION BY cc_orig ORDER BY NULL) AS row_num
    FROM table_a
) subquery
WHERE row_num = 1;

如果后续需要固定返回某条特定记录,只需把ORDER BY NULL换成具体排序字段即可,比如ORDER BY txn_orig DESC会返回每组中交易编号最大的那条。

方案2:使用GROUP BY + 聚合函数

如果对返回的其他字段没有特定要求(接受取字段的最小/最大值),可以用简单的分组聚合实现:

SELECT 
    cc_orig,
    MIN(cc_base) AS cc_base,
    MIN(txn_orig) AS txn_orig,
    MIN(txn_base) AS txn_base
FROM table_a
GROUP BY cc_orig;

这里用MIN()或MAX()都可以,它们会返回每组对应字段的极值,最终实现"每个cc_orig仅一条数据"的效果。

方案3:使用CONNECT BY + ROWNUM

这个方法利用Oracle的层次查询特性,通过ROWID识别每组的第一条记录:

SELECT cc_orig, cc_base, txn_orig, txn_base
FROM table_a a
WHERE ROWNUM = 1
CONNECT BY cc_orig = PRIOR cc_orig
START WITH NOT EXISTS (
    SELECT 1 FROM table_a WHERE cc_orig = a.cc_orig AND ROWID < a.ROWID
);

它能实现单字段去重,但可读性不如前两种方案,适合特定场景下使用。

以上三种方案在Oracle 11g(Toad 11.6适配的Oracle版本)中都能正常运行,你可以根据实际需求选择最合适的一种。

内容的提问来源于stack exchange,提问作者Bwales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 21:32:29