oracle - получение 1 или 0 записей в зависимости от количества вхождений неуникального поля - PullRequest
2 голосов
/ 21 сентября 2011

У меня есть стол 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 ]

3 голосов
/ 21 сентября 2011

Я думаю, что это должно делать то, что вы хотите:

SELECT
    my_field,
    MAX(n_rec)
FROM
    My_Table
GROUP BY
    my_field
HAVING
    COUNT(*) = 1
0 голосов
/ 21 сентября 2011

Вы также можете попробовать аналитическую или оконную версию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...