我正在尝试找到以下统计信息: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()
关键字....
答案 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
了解哪个更快的唯一方法是尝试每种方法并测量性能。