这个带有EXISTS的SQL查询是返回结果的最佳方式吗?

时间:2014-09-16 00:08:52

标签: sql tsql

我正在尝试找到以下统计信息:How many users have made at least one order

(是的,听起来像是家庭作业..但这是我真实查询的一个简单例子)。

这是编造的查询

SELECT COUNT(UserId)
FROM USERS a
WHERE EXISTS(
    SELECT OrderId
    FROM ORDERS b
    WHERE a.UserId = b.UserId
)

我觉得我得到了正确的答案,但我觉得这样做太过分了,效率很低。

我能否以更有效的方式获得此结果?

如果是linq,我觉得我想使用Any()关键字....

3 个答案:

答案 0 :(得分:3)

听起来你可以使用COUNT DISTINCT

SELECT COUNT(DISTINCT UserId)
FROM ORDERS 

这将返回表UserId中显示的OrderId的不同值的数量。

在回复sgeddes's comment时,为了确保UserId中也出现Users,只需执行JOIN

SELECT COUNT(DISTINCT b.UserId)
FROM ORDERS b
  JOIN USERS a 
    ON a.UserId = b.UserId

答案 1 :(得分:1)

Select count(distinct u.userid)
From USERS u
Inner join ORDERS o
On o.userid = u.userid

答案 2 :(得分:1)

您的查询应该没问题,但还有其他几种计算方法:

SELECT COUNT(*)
FROM USERS a
WHERE UserId IN (
    SELECT UserId 
    FROM ORDERS b
)

SELECT COUNT(DISTINCT UserID)
FROM USERS a
INNER JOIN ORDERS b ON a.UserID = b.UserID

了解哪个更快的唯一方法是尝试每种方法并测量性能。