【问题标题】:Oracle distinct on single column returning rowOracle 在单列返回行上不同
【发布时间】:2019-06-25 17:23:57
【问题描述】:

我有一个 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 | 临时 | 分区 | JOIN_INDEX |

非唯一 |有效 |正常 | N |否 |否 | ID

独特 |有效 |正常 | N |否 |否 | UNIQUE_ID

非唯一 |有效 |域名 | N |否 |否 | 名字

【问题讨论】:

  • 关于性能的问题应该包括CREATE TABLE/VIEW 结构和查询计划。如果没有这些信息,问题就很不清楚了。
  • 查询计划不正确,我无权获取正在运行的查询的 sql_id。
  • 至少为我们提供了索引可见的表/视图结构..
  • 如果您没有访问权限,请询问有权访问的人。如果不查看计划、表结构和索引,就不可能调整此查询。我投票结束这个问题,因为不清楚。

标签: sql oracle oracle11g


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多