Выберите из разных таблиц, используя подзапрос вместо соединения - PullRequest
0 голосов
/ 30 сентября 2019

Вот SQL-запрос, который я пытаюсь воссоздать, используя подзапрос. Я пытаюсь выбрать departmentID и самый высокий payRate для сотрудников (с идентификатором BusinessEntityID) в этом отделе.

Я использую AdventureWorks2017, если это поможет.

Я смог сделать это с JOIN

SELECT 
    DepartmentID, MAX(Rate) 'Rate'
FROM 
    HumanResources.EmployeeDepartmentHistory h
JOIN 
    HumanResources.EmployeePayHistory p ON h.BusinessEntityID = p.BusinessEntityID
GROUP BY 
    DepartmentID

enter image description here

enter image description here

Вот решение подзапроса, которое я пробовал, но не работало

SELECT DISTINCT 
    DepartmentID,
    (SELECT MAX(Rate)  
     FROM HumanResources.EmployeePayHistory p
     WHERE p.BusinessEntityID = h.BusinessEntityID) 'Rate'
FROM 
    HumanResources.EmployeeDepartmentHistory h
GROUP BY 
    DepartmentID, BusinessEntityID

Ответы [ 5 ]

0 голосов
/ 02 октября 2019

Не могу поверить, что я заставил его работать, но здесь.

SELECT DISTINCT 
       DepartmentID, 
(
    SELECT highest
    FROM
    (
        SELECT MAX(Rate) AS 'highest'
        FROM HumanResources.EmployeePayHistory b
        WHERE b.BusinessEntityID IN
        (
            SELECT DISTINCT 
                   a.BusinessEntityID
            FROM HumanResources.EmployeeDepartmentHistory a
            WHERE a.DepartmentID = h.DepartmentID
        )
    ) AS highest
) AS Rate
FROM HumanResources.EmployeeDepartmentHistory h;

enter image description here

0 голосов
/ 30 сентября 2019

Если честно, я не думаю, что нет чистого способа выбрать столбцы из 2 таблиц без объединения. Вы можете попробовать воспроизвести его, упорядочив обе таблицы, но я думаю, что это не очень хорошая идея.

SELECT DISTINCT 
    DepartmentID,
    BusinessEntityID,
    (SELECT MAX(Rate)  
     FROM HumanResources.EmployeePayHistory p
     WHERE p.BusinessEntityID = h.BusinessEntityID
     GROUP BY BusinessEntityID
     ORDER BY BusinessEntityID DESC) 'Rate'
FROM 
    HumanResources.EmployeeDepartmentHistory h
GROUP BY 
    DepartmentID,
ORDER BY
    BusinessEntityID DESC

Вы можете попробовать Subquery в объединении. Это будет намного чище

SELECT DISTINCT 
    h.DepartmentID,
    b.Rate
FROM 
    HumanResources.EmployeeDepartmentHistory h join 
        (SELECT MAX(Rate),
                BusinessEntityID  
         FROM HumanResources.EmployeePayHistory
         GROUP BY BusinessEntityID
         ) p
GROUP BY 
    h.DepartmentID, h.BusinessEntityID
0 голосов
/ 30 сентября 2019

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

SELECT h.DepartmentID,
       (SELECT MAX(Rate)  
        FROM HumanResources.EmployeePayHistory p
        WHERE p.BusinessEntityID = h.BusinessEntityID) AS Rate
FROM 
    HumanResources.EmployeeDepartmentHistory AS h
GROUP BY 
    h.DepartmentID;

Это должно вернуть те же результаты, что и ваш первый запрос.

0 голосов
/ 30 сентября 2019

См. Следующий код для справки

declare @tab table (DepartID integer, Name1 varchar(50))
declare @tab1 table (ID integer,DepartID integer, value1 float)

insert into @tab
select 1,'Sandy'
union all
select 2,'Ramesh'
union all
select 3,'Rani'

insert into @tab1
select 1,1,26.5
union all
select 2,1,29.0
union all
select 3,1,15.66
union all
select 4,2,60.3
union all
select 5,2,60.4
union all
select 6,3,10.0
union all
select 7,3,90.0

--select * from @tab
--select * from @tab1

select t.DepartID,max(t1.value1) as Rate
from @tab t
join @tab1 t1 on t.DepartID  = t1.DepartID
group by t.DepartID


select t.DepartID,(select max(t1.value1) from @tab1 t1 where t1.DepartID = t.DepartID) as Rate
from @tab t

Результат:

DepartID    Rate
1           29
2           60.4
3           90
0 голосов
/ 30 сентября 2019

ОК, лучше всего с объединением, но если вы не хотите, вы можете сделать это:

SELECT ds.DepartmentID, MAX(Rate) AS MaximumRate
FROM 
(
    SELECT edh.DepartmentID,
           (SELECT MAX(Rate)  
            FROM HumanResources.EmployeePayHistory p
            WHERE p.BusinessEntityID = edh.BusinessEntityID) AS Rate
    FROM HumanResources.EmployeeDepartmentHistory AS edh
    GROUP BY edh.DepartmentID, edh.BusinessEntityID
) AS ds
GROUP BY ds.DepartmentID;

Я думаю, что это то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...