В Oracle SQL, как я могу найти все значения в одном столбце, для которых в другом столбце существует более одного отдельного значения

У меня есть такая таблица Oracle

| id | code | info             | More cols |
|----|------|------------------|-----------|
| 1  | 13   | The Thirteen     | dggf      |
| 1  | 18   | The Eighteen     | ghdgffg   |
| 1  | 18   | The Eighteen     |           |
| 1  | 9    | The Nine         | ghdfgjgf  |
| 1  | 9    | Die Neun         | ghdfgjgf  |
| 1  | 75   | The Seventy-five | ghfgh     |
| 1  | 75   | The Seventy-five | ghfgh     |
| 1  | 2    | The Two          | ghfgh     |
| 1  | 27   | The Twenty-Seven |           |
| 1  | 27   | The Twenty-Seven |           |
| 1  | 27   | el  veintisiete  | fghfg     |
| .  | .    | .                | .         |
| .  | .    | .                | .         |
| .  | .    | .                | .         |

В этой таблице я хочу найти все строки со значениями в столбце code, которые имеют более одного различного значения в столбце info. Таким образом, из перечисленных строк это будут значения 9 и 27 и связанные строки.

Я попытался построить первый запрос, например

SELECT code FROM mytable
  WHERE COUNT(DISTINCT info) >1

но я получаю ошибку ORA-00934: групповая функция здесь не разрешена. Также я не знаю, как выразить условие COUNT(DISTINCT info) с фиксированным почтовым индексом.


person halloleo    schedule 04.11.2020    source источник


Ответы (2)


Вам нужно having с group by - aggregate functions не работает с where clause

SELECT code 
       FROM mytable
group by code
having COUNT(DISTINCT info) >1
person Fahmi    schedule 04.11.2020

Я бы написал ваш запрос как:

SELECT code
FROM yourTable
GROUP BY code
HAVING MIN(info) <> MAX(info);

При таком написании логики HAVING запрос остается доступным для анализа, а это означает, что индекс для (code, info) должен использоваться.

Вы также можете сделать это, используя существующую логику:

SELECT DISTINCT code
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable WHERE t2.code = t1.code AND t2.info <> t1.info);
person Tim Biegeleisen    schedule 04.11.2020