3 つのクエリの結果を結合する SQL クエリを作成しようとしています。
アイデアは、上位 1000 人のユーザーに新しいメッセージおよび/または要求および/または通知を取得し、週に 1 通メールを送信することです。
注: 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 のすべての行が含まれていない可能性があることを意味します。この例では問題ありません。一貫性よりもパフォーマンスが最適化されています。