Поиск, существуют ли дубликаты в 2 операторах select

#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 значения дублируются в каждом наборе всякий раз, когда оба результата, возвращаемые из каждой агрегации, больше нуля.

Demo

Ответ №3:

Очень простой метод, основанный на множестве, заключается в использовании intersect :

 select firstname
from College
where classid = 1
intersect
select firstname
from College
where classid in (2, 3);