简体   繁体   English

如何删除子查询?

[英]How to remove subquery?

I have to get all count for all orders, which was passed to query, even for null. 我必须获取所有传递给查询的订单的所有计数,即使是null。 I have developed such kind of query in SQL Server 2008R2: 我在SQL Server 2008R2中开发了这种查询:

SELECT COUNT(UserId), b.OrderId
FROM @OrderList b
LEFT JOIN 
(
    SELECT DISTINCT pat_base.UserId, prov_list.OrderId
    FROM Users pat_base
    LEFT JOIN Assetments hlth_asmt ON hlth_asmt.UserId = pat_base.UserId
        AND hlth_asmt.Date BETWEEN @StartDate AND @EndDate
    LEFT JOIN Logs proc_log ON proc_log.UserId = pat_base.UserId 
        AND proc_log.PLDATE BETWEEN @StartDate AND @EndDate
    LEFT JOIN Encounter med_enc_log ON med_enc_log.UserId = pat_base.UserId
        AND med_enc_log.EncounterDate BETWEEN @StartDate AND @EndDate
    LEFT JOIN @OrderList prov_list ON
        hlth_asmt.OrderId = prov_list.OrderId
        OR proc_log.OrderId = prov_list.OrderId
        OR med_enc_log.OrderId = prov_list.OrderId
    WHERE hlth_asmt.UserId IS NOT NULL
        OR proc_log.UserId IS NOT NULL
    OR med_enc_log.UserId IS NOT NULL
) a ON a.OrderId=b.OrderId
GROUP BY b.OrderId

If I remove joined subquery, order is being cut with many-to-many relation. 如果删除联接的子查询,订单将被削减与多对多的关系。 Is it possible to replace subquery with join? 是否可以用join替换子查询?

PS Here is output now: PS现在输出:

            OrderId
----------- -----------
8           10001
0           10003

Output without subquery: 不带子查询的输出:

            OrderId
----------- -----------
8           10001

you have to change 你必须改变

LEFT JOIN @OrderList prov_list ON

to

RIGHT JOIN @OrderList prov_list ON

if you use left join you filter out orders wich are in @OrderList but dont have expected user 如果您使用左联接,则可以过滤掉@OrderList中的订单,但没有预期的用户

so the query would be like 所以查询就像

SELECT COUNT(UserId), prov_list.OrderId
    FROM Users pat_base
    LEFT JOIN Assetments hlth_asmt ON hlth_asmt.UserId = pat_base.UserId
        AND hlth_asmt.Date BETWEEN @StartDate AND @EndDate
    LEFT JOIN Logs proc_log ON proc_log.UserId = pat_base.UserId 
        AND proc_log.PLDATE BETWEEN @StartDate AND @EndDate
    LEFT JOIN Encounter med_enc_log ON med_enc_log.UserId = pat_base.UserId
        AND med_enc_log.EncounterDate BETWEEN @StartDate AND @EndDate
    RIGHT JOIN @OrderList prov_list ON
        hlth_asmt.OrderId = prov_list.OrderId
        OR proc_log.OrderId = prov_list.OrderId
        OR med_enc_log.OrderId = prov_list.OrderId
    WHERE hlth_asmt.UserId IS NOT NULL
        OR proc_log.UserId IS NOT NULL
    OR med_enc_log.UserId IS NOT NULL
group by prov_list.OrderId

edit 编辑

yeah, that means that those rows were filtered out in where clause 是的,这意味着这些行在where子句中被过滤掉了

change it to 更改为

WHERE hlth_asmt.UserId IS NOT NULL
OR proc_log.UserId IS NOT NULL
OR med_enc_log.UserId IS NOT NULL
OR pat_base IS NULL

but i think what it means, is that you have inconsistent data within db 但是我认为这意味着您的数据库中的数据不一致

You can return the result from a single query, but I'd recommend not using a join. 您可以从单个查询返回结果,但建议您不要使用联接。 Instead, remove your outer query, and change to inner query to use a windowing function on the count. 相反,请删除外部查询,然后更改为内部查询以对计数使用窗口函数。 So your SELECT clause would be something similar to: 因此,您的SELECT子句类似于:

SELECT DISTINCT
   pat_base.UserId,
   prov_list.OrderId,
   COUNT(pat_base.UserId) OVER (PARTITION BY prov_list.OrderId) as UserCount

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM