0

我正在使用 Oracle 11g 第 1 版。跟进这个问题

拥有这组行:

Name     Contact_No

A        123
A        124
B        125
C        126
C        127

我想使用分析函数返回它:

Name     Contact_No
B        125

我可以这样做

select name, Contact_No
from   tbl_name
where  name in ( SELECT name
                 FROM   tbl_name
                 GROUP  BY name
                 HAVING COUNT(name) = 1
                )

或这个

SELECT name, max(Contact_No)
FROM   tbl_name
GROUP  BY name
HAVING COUNT(name) = 1

但是我想要一个解决方案,我可以避免子查询或将表与自身连接或使用 min/max,这可能会使任何阅读代码的人感到困惑!我相信这可以通过分析函数实现,但我不知道如何?

4

1 回答 1

2

没错,你需要使用解析函数;如果你想返回整行。根据您当前的查询来判断COUNT().

select *
  from ( select a.*, count(*) over ( partition by name ) as ct
           from tbl_name )
 where ct = 1

解释一下,partition by 实际上与 GROUP BY 相同,只是不做任何事情。这计算每个名称的记录数并返回该行内,无论具有该名称的记录数如何。然后,您可以限制此生成的列。

尽管这确实使用了子查询,但这种方法本质上没有任何问题。您只扫描一次表/索引;与您当前扫描两次的示例不同。

我通常会建议你在NAME这里有一个索引,但这取决于你的具体情况。您可能需要扫描整个表,在这种情况下索引不会帮助您。

此外,如果您只有这两列,则分析查询毫无意义。您可以使用第二个选项来获得相同的结果。

SELECT name, max(Contact_No)
  FROM tbl_name
 GROUP BY name
HAVING COUNT(name) = 1

当您需要返回无法包含在 GROUP BY 中的其他列时,分析查询很有用。

于 2013-04-05T12:03:06.487 回答