Выберите все строки, содержащие все элементы группы

#sql #sql-server

#sql #sql-сервер

Вопрос:

Столбец [ТИП] имеет A, или B, или C. Я хочу выбрать список имен, в которых есть все A, B, C в таблице.

введите описание изображения здесь

Результат

введите описание изображения здесь

 
    -- dealing with count
    select name from tempso group by name 
    having count(*) = (select count(distinct type) from tempso);
  
 
    -- dealing with specifying elements
    select name from tempso group by name 
    having type in all('A', 'B', 'C');
  

На самом деле, я хотел сделать это вторым методом, потому что ТИПЫ A, B, C имеют подтипы, поэтому существует риск дублирования, но я получил эту ошибку ниже.

Msg 156, Level 15, State 1, Line 10 syntax error 'all'...

Есть ли какой-либо способ сделать это?

Комментарии:

1. Все, что вам нужно сделать, это показать нам, что вы пробовали.

2. Я обновил, Дейл.

Ответ №1:

Вы можете использовать group by и having :

 select name
from t
group by name
having count(*) = (select count(distinct type) from t);
  

Это предполагает, что name / type строки не повторяются в таблице.

Редактировать:

Если вы просто хотите проверить наличие A / B / C, то:

 select name
from t
where type in ('A', 'B', 'C')
group by name
having count(*) = 3;
  

Или:

 having count(distinct type) = 3
  

если в таблице есть дубликаты.

Комментарии:

1. Похоже, что этот запрос не сработает. Он проверяет, равно ли число целых чисел набору строк.

2. Спасибо за ваш ответ, Гордон. Доступ с помощью count — это почти лучшая идея в текущей ситуации.

3. Это все равно не сработает, теперь, когда я думаю об этом. Например, если одна строка связана с A , B и D , она будет включать ее неправильно.

4. @jpmc26 . . . Нет, потому что тогда D в таблице был бы другой тип, то есть их было бы 4. И никакие name s не будут совпадать.

Ответ №2:

выберите имя из @table, где введите (‘A’, ‘B’,’C’) группу по имени, имеющую количество (Name)>=3

Комментарии:

1. «Count» будет лучшим решением на данный момент. Спасибо, Викрам.

Ответ №3:

Вы используете недопустимую функцию ‘all’. а также это не работает в invalid в предложении HAVING.Итак, пожалуйста, попробуйте это.

 SELECT name,count(*)  AS cnt FROM tempso 
WHERE [type] in ('A', 'B', 'C')
GROUP BY name HAVING count(Name) >= 3
  

Комментарии:

1. Спасибо за комментарий, Хеманг, но мне нужно имя, в котором есть все ‘A’, ‘B’, ‘C’ в исходной таблице.

2. Хорошо. Пожалуйста, замените просто имя таблицы @tbl на tempso

3. Hemang извините, но я имел в виду, что мне нужны только имена, в которых должны быть ВСЕ ‘A’, ‘B’, ‘C’ в таблице.

4. Пожалуйста, добавьте having в группу by, и я обновил решение.

5. Спасибо, что потратили свое драгоценное время на эту статью, Хеманг.