首页 > 解决方案 > 如何将 2 个相关子查询与联接和条件聚合一起使用

问题描述

我在下面有 2 个查询,我希望将输出组合起来。

select distinct [User].UserID, fname,  lname, JobTitle
from [User] 
join [Order] on [User].UserID = [Order].UserID
用户身份 名称 名字 职称
1 约翰 史密斯 工程师
2 特里 能源部 工程师
select [order].UserID,
    (
        select avg(case when ReturnTypeID = 5 then 1.0 else 0 end) as DefectedRate
        from RentalItems 
        where RentalItems.OrderID = [Order].OrderID 
    ) as DefectedReturnRate
from [Order] 
where OrderID in (select OrderID from RentalItems where ReturnTypeID=5)

用户身份 缺陷退货率
1 0.66
2 0.33

期望的输出

用户身份 名称 名字 职称 缺陷退货率
1 约翰 史密斯 工程师 0.66
2 特里 能源部 工程师 0.33

我的三个表如下:

用户: userID、fname、lname、JobTitle

订单: OrderID、UserID

RentalItems:RentalItemsID、OrderID

标签: sqlsql-servertsql

解决方案


鉴于您似乎只是需要用户信息,加入它怎么样?

select U.UserID, U.fname, U.lname, U.JobTitle,
    (
        select avg(case when ReturnTypeID = 5 then 1.0 else 0 end) as DefectedRate
        from RentalItems R
        where R.OrderID = o.OrderID 
    ) as DefectedReturnRate
from [Order] O
inner join [User] U on U.UserID = O.UserID
where O.OrderID in (select OrderID from RentalItems where ReturnTypeID = 5);

为清楚起见,请注意使用漂亮的短表别名。

顺便说一句,如果您发现自己需要将 2 个查询连接在一起,您的操作与表连接完全相同,例如

select *
from (
  {sub-query 1)
)
inner join (
  {sub-query 2)
) on {some condition}

为了进一步获取有订单的用户列表,exists子句比连接更清晰,例如

select UserID, fname, lname, JobTitle
from [User] U 
where exists (select 1 from [Order] O where U.UserID = O.UserID)

推荐阅读