我正在尝试创建一个将 3 个查询的结果组合在一起的 SQL 查询。
这个想法是让前 1000 名用户收到新消息和/或请求和/或通知,然后每周给他们发一封电子邮件。
注意:我使用的是 MS SQL Server。
我有 3 个单独的复杂查询(我在这里简化了),例如:
'Get all users with new messages:
SELECT mbrid, messageCount
FROM tblMessages
WHERE messageCount > 0
'Get all users with new notifications:
SELECT mbrid, notificationCount
FROM tblNotifications
WHERE notificationCount > 0
'Get all users with new requests:
SELECT mbrid, requestCount
FROM tblRequests
WHERE requestCount > 0
我想将所有 3 个合并到 1 个表中,然后选择 TOP 1000 记录。
例如
如果每个查询都返回:
mbrID messageCount
---------------------
2 20
3 2
mbrID notificationCount
---------------------
1 1
3 2
mbrID requestCount
---------------------
3 2
我想结合这 3 个结果来创建一个像这样的表:
mbrID messageCount notificationCount requestCount
----------------------------------------------------------
1 0 1 0
2 20 0 0
3 2 2 2
请注意,组合结果应使用空白填充缺失的行,例如:0
这甚至可能吗?
如果有数百万条记录,我想这将是非常低效的。有什么更好的方法吗?
更新
这是我最终选择的(@Upendra Chaudhari 解决方案),感谢大家的帮助。
SELECT TOP (1000)
mbrID,
SUM(messageCount) AS messageCount,
SUM(notificationCount) AS notificationCount,
SUM(requestCount) AS requestCount
FROM (
SELECT TOP (1000)
mbrID,
messageCount,
0 AS notificationCount,
0 AS requestCount
FROM
usrv_CommMessagesNew
ORDER BY
mbrID
UNION
SELECT TOP (1000)
mbrID,
0 AS messageCount,
notificationCount,
0 AS requestCount
FROM
usrv_CommNotificationsNew
ORDER BY
mbrID
UNION
SELECT TOP (1000)
mbrID,
0 AS messageCount,
0 AS notificationCount,
requestCount
FROM
usrv_CommRequestsNew
ORDER BY
mbrID
) AS tblTemp
GROUP BY
mbrID
TOP 1000 子句限制结果以提高性能。
因此,messageCount 优先,然后是 notificationCount,然后是 requestCount。
这意味着数据可能不包括 notificationCount 或 requestCount 的所有行 - 在这种情况下我很好 - 它针对一致性进行了优化。