#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. Спасибо, что потратили свое драгоценное время на эту статью, Хеманг.