0

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 のすべての行が含まれていない可能性があることを意味します。この例では問題ありません。一貫性よりもパフォーマンスが最適化されています。

4

3 に答える 3

0

このようにUNIONを試してください:

    SELECT  mbrid, SUM(messageCount), SUM(notificationCount), SUM(requestCount)
FROM    (
            SELECT mbrid, messageCount, 0 AS notificationCount, 0 AS requestCount
            FROM tblMessages
            WHERE messageCount > 0

            UNION

            SELECT mbrid, 0 AS messageCount, notificationCount, 0 AS requestCount
            FROM tblNotifications
            WHERE notificationCount > 0

            UNION

            SELECT mbrid, 0 AS messageCount, 0 AS notificationCount, requestCount
            FROM tblRequests
            WHERE requestCount > 0
        ) TempTable
GROUP BY mbrid
于 2013-10-10T11:21:50.347 に答える
0

興味深いことに、3 つのテーブルすべてを "結合" すると、上位 1000 のレコードをどのように決定するのでしょうか?

メッセージ、通知、およびリクエストを同様に処理することを意図している場合は、以下が探している答えになる可能性があります。

SELECT TOP 1000 * FROM
(SELECT mbrid, messageCount as Count
FROM tblMessages
WHERE messageCount > 0
UNION ALL
SELECT mbrid, notificationCount as Count
FROM tblNotifications
WHERE notificationCount > 0
UNION ALL
SELECT mbrid, requestCount as Count
FROM tblRequests
WHERE requestCount > 0
ORDER BY Count DESC) d

UNION および UNION ALL 演算子の詳細については、このウィキペディアのページを参照してください。

于 2013-10-10T11:29:25.897 に答える
0

を使用するCOALESCE場合は、使用するOUTER JOIN必要があります。これで問題ありません。

SELECT COALESCE(m.mbrid, r.mbrid, n.mbrid) AS mbrid, ISNULL(m.messageCount,0) AS messageCount, ISNULL(n.NotificationCount,0) AS NotificationCount, ISNULL(r.requestCount, 0) AS requestCount
FROM tblMessages m
FULL JOIN tblNotifications n
    ON m.mbrid = n.mbrid
    AND m.messageCount > 0
    AND n.notificationCount > 0
FULL JOIN tblRequests r
    ON m.mbrid = r.mbrid
    AND r.requestCount > 0  
ORDER BY mbrid

原因はあなたが望むものを正確に返します:

| MBRID | MESSAGECOUNT | NOTIFICATIONCOUNT | REQUESTCOUNT |
|-------|--------------|-------------------|--------------|
|     1 |            0 |                 1 |            0 |
|     2 |           20 |                 0 |            0 |
|     3 |            2 |                 2 |            2 |

ここでわかるように。

于 2013-10-10T12:34:44.417 に答える