#sql #sql-server #sql-server-2016
#sql #sql-сервер #sql-server-2016
Вопрос:
Не могли бы вы помочь мне с помощью инструкции SQL найти повторяющиеся имена, присутствующие в первом операторе выбора и втором.
Например: мне нужно определить, присутствует ли ученик с тем же именем в классе 1 или нет в классе 2 или 3.
select firstname from College where classid = 1
и второй оператор выбора :
select firstname from College where classid in (2, 3)
Если для любого имени есть совпадающие вхождения, я хочу выбрать эту запись.
Комментарии:
1. Можно использовать EXISTS . (sql-server) или СУЩЕСТВУЕТ для MySQL
2. @Luuk не могли бы вы ответить кодом? Спасибо
3. Вам нужно будет добавить некоторые структуры таблиц, поскольку любой ответ, вероятно, не ответит на ваш (домашний) вопрос, поскольку я сомневаюсь, что у колледжа действительно есть имя. И посмотрите, как использовать предложение Exists .
4. @Arrow: очень просто!, примеры приведены по ссылкам в документации.
Ответ №1:
Объединение может быть одним из вариантов
select a.firstname
from
(
select firstname from College where classid = 1
)a join (
select firstname from College where classid in(2,3)
)b on a.firstname=b.firstname
ИЛИ, в качестве альтернативы, вы можете попробовать использовать exists
select firstname from College c where classid = 1
and exists (select 1 from College c1 where c.firstname=c1.firstname and classid in(2,3))
Ответ №2:
Вы можете суммировать количество существований для каждого набора ( classid=1
против classid in (2,3)
), используя GROUP BY
выражение с HAVING
предложением, таким как
SELECT firstname
FROM College
GROUP BY firstname
HAVING SUM(CASE WHEN classid = 1 THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN classid IN (2,3) THEN 1 ELSE 0 END) > 0
firstname
значения дублируются в каждом наборе всякий раз, когда оба результата, возвращаемые из каждой агрегации, больше нуля.
Ответ №3:
Очень простой метод, основанный на множестве, заключается в использовании intersect
:
select firstname
from College
where classid = 1
intersect
select firstname
from College
where classid in (2, 3);