首页 > 解决方案 > 如何在普通 SQL 中只选择一次元素

问题描述

我见过其他与我类似的问题,但我还没有找到一个可以真正帮助我的问题。我有一个表,定义如下:

CREATE TABLE "DOWNLOAD_HISTORY" 
   (    "ID" NUMBER GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 344 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE, 
    "IDUSER" NUMBER NOT NULL ENABLE, 
    "IDFORNITORE" NUMBER NOT NULL ENABLE, 
    "IDRFX" NUMBER NOT NULL ENABLE, 
    "DOCNUM" NUMBER NOT NULL ENABLE, 
    "DOWNLOAD_TIMESTAMP" TIMESTAMP (6) NOT NULL ENABLE
   ) ;

此 DDL 来自 OracleDB12 数据库。
以下是一些示例数据

在此处输入图像描述

我想要完成的是:如果已经有一行具有相同的元组(IDRFX,DOCNUM),则不将其包含在 SELECT 语句中。因此,元组 (384,1) 应该只出现一次。


我所做的(到目前为止):考虑到甚至可以从 MSSQL 数据库执行此查询,我尝试用普通 SQL 编写这两个查询。

SELECT * 
FROM DOWNLOAD_HISTORY dh 
WHERE dh.IDRFX = 384 AND ID IN (SELECT ID FROM DOWNLOAD_HISTORY dh2 WHERE dh.DOCNUM <> dh2.DOCNUM AND dh.IDRFX <> dh2.IDRFX )



SELECT t1.*
FROM DOWNLOAD_HISTORY t1
WHERE NOT EXISTS (SELECT * from DOWNLOAD_HISTORY t2
                  where t2.DOCNUM = t1.DOCNUM 
                    and t2.IDRFX = t1.IDRFX)

但他们中没有一个能够真正把我带到任何地方。如果可能的话,我想问一下我在哪里做错了,我该如何解决。

标签: sqlsql-serveroracle

解决方案


没有解析函数......

    with data as(
select 1 id, 384 idrfx, 1 docnum from dual union all
select 2 id, 384 idrfx, 1 docnum from dual union all
select 3 id, 384 idrfx, 2 docnum from dual union all
select 4 id, 385 idrfx, 1 docnum from dual 
)
,uniqueTuple as  (
select min(id) id from data
group by idrfx,docnum 
)

select d.* 
from data d
join uniqueTuple u on u.id = d.id 

推荐阅读