SQL запрос, возвращающий неверный результат, чтобы получить отделы - PullRequest
3 голосов
/ 18 января 2020

У меня есть таблица Department вот так:

DepartmentName    City            NumberOfEmployees    Country
----------------------------------------------------------------
Abc               California      100                  USA
Xyz               Chicago         200                  USA
Lmn               Sydney          300                  Aus
Pqr               Paris           400                  France

Технологии :

TechnologyId    Name     DepartmentName 
----------------------------------------
1               Hadoop     Abc
2               Hadoop     Abc
3               Hadoop     Xyz
4               Hadoop     Lmn
5               Adobe      Pqr
6               Adobe      Lmn
7               Adobe      Abc

Вот что я пытаюсь сделать:

  • Получить все отделы, в которых есть oop и Adobe

Запрос:

SELECT 
    Department.DepartmentName, Department.DepartmentName, 
    Department.DepartmentName, Department.DepartmentName, 
    Technologies.Name 
FROM 
    Department 
INNER JOIN 
    Technologies ON Department.DepartmentName = Technologies.DepartmentName
WHERE 
    (((Technologies.Name) IN ('Hadoop', 'Adobe')));

Но это возвращает неверный результат.

Может кто-нибудь помочь мне с вопросом?

Ответы [ 6 ]

2 голосов
/ 18 января 2020

Я бы использовал exists:

select d.*
from department d
where
    exists (
        select 1 
        from technologies t 
        where t.departmentname = d.departmentname and t.name = 'Hadoop'
    )
    and exists (
        select 1 
        from technologies t 
        where t.departmentname = d.departmentname and t.name = 'Adobe'
    )

При индексе technologies(departmentname, name) это должно быть эффективным вариантом.

1 голос
/ 19 января 2020

Вы можете присоединить таблицу Departments к агрегированному подзапросу, который использует min & max, чтобы убедиться, что в отделе содержатся обе целевые технологии, например:

select d.* from department d inner join
(
    select t.departmentname
    from technologies t
    where t.name in ('Adobe','Hadoop')
    group by t.departmentname
    having min(t.name)='Adobe' and max(t.name)='Hadoop'
) q
on d.departmentname = q.departmentname
1 голос
/ 18 января 2020
select    d.*
from      Department d
          join Technologies t
            on d.DepartmentName = t.DepartmentName
where     t.Name in ('Hadoop', 'Adobe')
group by  t.DepartmentName   
having    count(distinct t.Name) = 2

Выход

#   DepartmentName       City NumberOfEmployees Country
# 1            Abc California               100     USA
# 2            Lmn     Sydney               300     Aus

Вот еще один вариант, если вы не можете использовать count(distinct, но я думаю, что он может быть менее эффективным, чем exists, как в ответе @ GMB

select    distinct
          d.*
from      Department d
          join Technologies t_h
            on d.DepartmentName = t_h.DepartmentName
          join Technologies t_a
            on d.DepartmentName = t_a.DepartmentName
where     t_h.Name = 'Hadoop'
          and t_a.Name = 'Adobe'
1 голос
/ 18 января 2020

Если вам нужно только DepartmentName, вам не нужно использовать таблицу отдела, и этот запрос будет работать:

select distinct t.departmentname
  from technologies t
 where t.name = 'Hadoop'
   and exists (select 1 
                from technologies t2 
               where t.departmentname = t2.departmentname
                 and t2.name = 'Adobe')

Если вам нужно больше из таблицы отдела, то go с ответом от @ GMB

1 голос
/ 18 января 2020

Если вам просто нужно название отдела, агрегирование просто:

select t.departmentname
from technologies t
where t.Name in ('Hadoop', 'Adobe')
group by t.departmentname
having min(t.name) <> max(t.name)

Таблица departments нужна вам только в том случае, если для набора результатов нужны дополнительные столбцы.

1 голос
/ 18 января 2020

попробуйте как показано ниже, используя distinct count

SELECT  Department.DepartmentName, City,NumberOfEmployees,Country
FROM Department  where DepartmentName in (

select DepartmentName  from Technologies
WHERE Name In ('Hadoop','Adobe')
group by DepartmentName
having count( distinct Name)=2
)
...