将分析子句与 DISTINCT 一起使用

Using Analytical Clauses with DISTINCT

目的是使用 DISTINC 查询多个表(如果不是我得到数百万行作为结果),但同时使用 sample 从结果中收集 10% 的样本,这些样本应该都是唯一的。我收到以下错误:

ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY, etc.

这是我写的代码:

WITH V AS (SELECT DISTINCT AL1."NO", AL3."IR", AL1."ACCT", AL3."CUST_DA", AL1."NA", 
                AL3."1_LINE", AL3."2_LINE", AL3."3_LINE", AL1."DA", 
                AL1."CD", AL1."TITLE_NA", AL1."ENT_NA", AL3."ACCT", 
                AL3."ACCTLNK_ENRL_CNT" 

FROM "DOC"."DOCUMENT" AL1, "DOC"."VNDR" AL2, "DOC"."CUST_ACCT" AL3 

WHERE (AL1."ACCT"=AL2."VNDR" 

AND AL2."ACCT"=AL3."ACCT")  

AND ((AL1."IMG_DA" >= Trunc(sysdate-1) 

AND AL1."PROC"='A' 

AND AL3."ACCT"<>'03')))


SELECT * FROM V SAMPLE(10.0)

你不能sample这样的连接视图。

更简单的测试用例(MCVE):

with v as
     ( select d1.dummy from dual d1
              join dual d2 on d2.dummy = d1.dummy
     )
select * from v sample(10);

失败:

ORA-01445: cannot select ROWID from, or sample, a join view without a key-preserved table

最简单的解决方法是将 sample 子句移动到驱动 table:

with v as
     ( select d1.dummy from dual sample(10) d1
              join dual d2 on d2.dummy = d1.dummy
     )
select * from v;

因此,我会将您的观点重写为:

with v as
     ( select distinct
              d.no
            , a.ir
            , d.acct
            , a.cust_da
            , d.na
            , a."1_LINE", a."2_LINE", a."3_LINE"
            , d.da, d.cd, d.title_na, d.ent_na
            , a.acct
            , a.acctlnk_enrl_cnt
       from   doc.document sample(10) d
              join doc.vndr v
                   on  v.vndr = d.acct
              join doc.cust_acct a
                   on  a.acct = v.acct
       and    d.img_da >= trunc(sysdate - 1)
       and    d.proc = 'A'
       and    a.acct <> '03'
     )
select * from v;