[英]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.