我有一个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
答案 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