Найти запрос внутри другого запроса в SQL Server - PullRequest
0 голосов
/ 01 марта 2019

Итак, у меня есть 2 разных запроса, которые работают так, как они предназначены.Запрос A:

select tipo.descripcion as tipoId, tipo.id
from Empleados emp 
inner join dbo.Opciones op ON op.empleadoId = emp.id 
inner join dbo.TipoEquipo tipo ON tipo.id = op.tipoEquipoId 
where username='user' order by op.numOpcion

Результат A:

tipoId      id
EquipmentD  3
EquipmentC  10
EquipmentB  11
EquipmentA  13

Запрос B:

select 
    tip.id, 
    tip.descripcion as Descripcion, 
    sum(case when eq.asignado='No' Then 1 Else 0 END) as conteoNo
from Equipos eq 
left outer join TipoEquipo tip on tip.id=eq.tipoId
group by tip.descripcion, tip.id

РезультатB:

id  Descripcion conteoNo
1   EquipmentY  3
2   EquipmentX  64
3   EquipmentD  31
4   EquipmentF  0
5   EquipmentH  1
7   EquipmentO  1
8   EquipmentT  5
9   EquipmentG  8
10  EquipmentC  7
11  EquipmentB  2
13  EquipmentA  2

Итак, я хочучтобы пересечь результаты, потому что у них есть уникальные идентификаторы, которые совместно используются таблицами, поэтому я хочу присоединиться к ним, возможно, с помощью внутреннего объединения?

Что-то вроде A.id с B.id и отобразить что-то вроде id| tipoId | conteo (но только с использованием значений, найденных в Query A. Я думал что-то вроде выбора внутри другого выбора. Что-то вроде Results A + conteoNo.

select tipo.descripcion as tipoId, tipo.id
from Empleados emp inner join (
    select 
        tip.id, 
        tip.descripcion as Descripcion, 
        sum(case when eq.asignado='No' Then 1 Else 0 END) as conteoNo
    from Equipos eq 
    left outer join TipoEquipo tip on tip.id=eq.tipoId
    group by tip.descripcion, tip.id
) x on tipo.id = x.id
inner join dbo.Opciones op ON op.empleadoId = emp.id 
inner join dbo.TipoEquipo tipo ON tipo.id = op.tipoEquipoId 
where username='landerosj' order by op.numOpcion

Не знаю, является ли это дажевозможно, или я должен просто пойти с хранимой процедурой?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я думаю, что можно было бы просто ввести таблицу Equipos в первый запрос с LEFT JOIN, а затем включить агрегирование.Это приведет к гораздо более простому запросу, чем при объединении результатов двух запросов:

Try:

select 
    tipo.id,
    tipo.descripcion as tipoId, 
    op.numOpcion,
    sum(case when eq.asignado='No' Then 1 Else 0 END) as conteoNo
from  dbo.Empleados emp 
inner join dbo.Opciones op     on op.empleadoId = emp.id 
inner join dbo.TipoEquipo tipo on tipo.id = op.tipoEquipoId
left  join dbo.Equipos eq       on tipo.id=eq.tipoId
where username='user' 
group by tipo.id, tipo.descripcion, op.numOpcion
order by op.numOpcion
0 голосов
/ 01 марта 2019

Это то, что вы хотите?

select tip.id, tt.tipoIOd,
       sum(case when eq.asignado = 'No' Then 1 Else 0 END) as conteoNo
from Equipos eq join   -- outer join seems unnecessary
     TipoEquipo tip
     on tip.id = eq.tipoId join
     (select tipo.id, tipo.descripcion as tipoId
      from Empleados emp join
           dbo.Opciones op 
           on op.empleadoId = emp.id join
           dbo.TipoEquipo tipo 
           on tipo.id = op.tipoEquipoId 
      where username = 'user'
     ) tt
     on tip.id = tt.id
group by tip.id, tt.tipoIOd
order by op.numOpcion;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...