oracle - 根据非唯一字段的出现次数获取1或0条记录

时间:2011-09-21 16:12:44

标签: sql oracle

我有一张表MYTABLE

N_REC | MYFIELD |
1     | foo     |
2     | foo     |
3     | bar     |

其中N_REC是主键,MYFIELD是非唯一字段。 我需要在MYFIELD上查询这个表并提取相关的N_REC,但前提是只有一个MYFIELD出现;否则我不需要返回任何记录。 因此,如果我使用MYFIELD ='bar',我将获得3,如果我使用MYFIELD ='foo',我将无法获得任何记录。

我选择了以下查询

select * from 
   ( 
   select 
     n_rec, 
     ( select count(*) from mytable where mycolumn=my.mycolumn ) as counter 
   from mytable my where mycolumn=? 
   ) 
where counter=1

虽然它给了我想要的结果,但我觉得我正在运行两次相同的查询。 有没有更好的方法来实现我正在做的事情?

2 个答案:

答案 0 :(得分:3)

我认为这应该做你想要的:

SELECT
    my_field,
    MAX(n_rec)
FROM
    My_Table
GROUP BY
    my_field
HAVING
    COUNT(*) = 1

答案 1 :(得分:0)

您也可以尝试使用count(*)的分析或窗口版本,并将计划与其他选项进行比较:

select n_rec, my_field
from (select n_rec, my_field
        , count(*) over (partition by my_field) as Counter
    from myTable
    where my_field = ?)
where Counter = 1