Oracle在单列返回行上不同

时间:2019-06-25 17:23:57

标签: sql oracle oracle11g

我有一个api端点,该端点接受用于对特定列进行过滤的不同参数。由于这个原因,我试图构建一个易于向基本查询添加任意过滤器的查询。由于某些原因,如果我使用:

SELECT "MY_VIEW".* 
FROM   "MY_VIEW" 
    -- Distinct on ID filter
    WHERE ID IN (SELECT Max(ID) 
    FROM  "MY_VIEW" 
    GROUP  BY ID) 
    -- Other arbitrary filters...
ORDER  BY "MY_VIEW"."NAME" DESC

我的性能很差,所以我开始使用此查询:

SELECT * FROM "MY_VIEW"
     -- Distinct on ID filter
     LEFT JOIN(
        SELECT DISTINCT
        FIRST_VALUE("MY_VIEW"."ID")
          OVER(PARTITION BY "MY_VIEW"."UNIQUE_ID") as DISTINCT_ID 
        FROM  "MY_VIEW"
    ) d ON d.DISTINCT_ID = "MY_VIEW"."ID"
    -- Other arbitrary filters...
    ORDER  BY "MY_VIEW"."NAME" DESC
)

但是当我离开联接时,它会丢弃唯一的过滤器。

我也不能使用rowid,因为它是一个视图。

该视图是版本表。

索引信息

唯一性 | 状态 | INDEX_TYPE | 临时 | 已PARTITIONED | JOIN_INDEX |

非独特|有效|正常| N |否|否| ID

唯一|有效|正常| N |否|否| UNIQUE_ID

非独特|有效| DOMAIN | N |否|否| NAME

1 个答案:

答案 0 :(得分:0)

我没有足够的声誉来发表“评论”,所以我将其发布为“答案”。您的第一个示例是:

SELECT "MY_VIEW".* 
FROM   "MY_VIEW" 
    -- Distinct on ID filter
    WHERE ID IN (SELECT Max(ID) 
    FROM  "MY_VIEW" 
    GROUP  BY ID) 
    -- Other arbitrary filters...
ORDER  BY "MY_VIEW"."NAME" DESC

但是您是否意识到“ GROUP BY ID”子句抵消了MAX()函数对ID的影响?换句话说,您将获得所有行,并且将根据每行的ID计算MAX,返回。 。 。该行的ID。也许尝试:

SELECT "MY_VIEW".* 
FROM   "MY_VIEW" 
    -- Distinct on ID filter
    WHERE ID IN (SELECT Max(ID) 
    FROM  "MY_VIEW") 
    -- Other arbitrary filters...
ORDER  BY "MY_VIEW"."NAME" DESC