0

次のクエリを実行しています

SELECT
    ROW_NUMBER() OVER(ORDER BY [TransactionValues].[ID]) AS idx,
    [Transactions].[ID] AS [id],
    [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
    [Transactions].[Uploaded] AS [uploaded],
    [Transactions].[Visible] AS [visible],
    [Fields].[ID] AS [fieldId],
    [Fields].[FriendlyName] AS [friendlyName],
    [Fields].[OfficialName] AS [officialName],
    [Fields].[Order] AS [order],
    [Fields].[Visible] AS [valueVisible],
    [TransactionValues].[ID] AS [valueId],
    [TransactionValues].[FieldID] AS [valueFieldId],
    [TransactionValues].[FriendlyValue] AS [friendlyValue],
    [TransactionValues].[OfficialValue] AS [officialValue],
    [TransactionValues].[TransactionID] AS [transactionId]
FROM
    [Transactions]
    INNER JOIN [TransactionValues]
    ON [TransactionValues].[TransactionID] = [Transactions].[ID]
    INNER JOIN [Fields]
    ON [TransactionValues].[FieldID] = [Fields].[ID]
WHERE
    [Transactions].[EncryptedAccountID] = @encryptedAccountID
FOR XML AUTO, ROOT('root')

次の形式で XML を返します (返される属性値は省略しました - これらは関係ありません)。

<root>
    <Transactions idx="" id="" encryptedAccountID="" uploaded="" visible="">
        <Fields id="" friendlyName="" officialName="" order="" visible="">
            <TransactionValues valueId="" valueFieldId="" friendlyValue="" officialValue="" transactionId="" />
        </Fields>
        <Fields id="" friendlyName="" officialName="" order="" visible="">
            <TransactionValues valueId="" valueFieldId="" friendlyValue="" officialValue="" transactionId="" />
        </Fields>
    </Transactions>
    <Transactions idx="" id="" encryptedAccountID="" uploaded="" visible="">
        <Fields id="" friendlyName="" officialName="" order="" visible="">
            <TransactionValues valueId="" valueFieldId="" friendlyValue="" officialValue="" transactionId="" />
        </Fields>
        <Fields id="" friendlyName="" officialName="" order="" visible="">
            <TransactionValues valueId="" valueFieldId="" friendlyValue="" officialValue="" transactionId="" />
        </Fields>
    </Transactions>
</root>

ここまでは順調ですね。

ここで、結果をページ付けしたいと思います。この一部では、上記のクエリをサブクエリとして実行する必要があります。したがって、次のクエリがあります。

SELECT
*
FROM
(
    SELECT
        ROW_NUMBER() OVER(ORDER BY [TransactionValues].[ID]) AS idx,
        [Transactions].[ID] AS [id],
        [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
        [Transactions].[Uploaded] AS [uploaded],
        [Transactions].[Visible] AS [visible],
        [Fields].[ID] AS [fieldId],
        [Fields].[FriendlyName] AS [friendlyName],
        [Fields].[OfficialName] AS [officialName],
        [Fields].[Order] AS [order],
        [Fields].[Visible] AS [valueVisible],
        [TransactionValues].[ID] AS [valueId],
        [TransactionValues].[FieldID] AS [valueFieldId],
        [TransactionValues].[FriendlyValue] AS [friendlyValue],
        [TransactionValues].[OfficialValue] AS [officialValue],
        [TransactionValues].[TransactionID] AS [transactionId]
    FROM
        [Transactions]
        INNER JOIN [TransactionValues]
        ON [TransactionValues].[TransactionID] = [Transactions].[ID]
        INNER JOIN [Fields]
        ON [TransactionValues].[FieldID] = .[Fields].[ID]
    WHERE
        [Transactions].[EncryptedAccountID] = @encryptedAccountID
) AS [TransactionInfo]
WHERE
    idx > 5
AND
    idx <= 20
ORDER BY
    [id], [order] ASC
FOR XML AUTO, ROOT('root')

ただし、これは次の XML を返します。

<root>
    <TransactionInfo idx="" id="" encryptedAccountID="" uploaded="" visible="" fieldId="" friendlyName="" officialName="" order="" valueVisible="" valueId="" valueFieldId="" friendlyValue="" officialValue="" transactionId="" />
    <TransactionInfo idx="" id="" encryptedAccountID="" uploaded="" visible="" fieldId="" friendlyName="" officialName="" order="" valueVisible="" valueId="" valueFieldId="" friendlyValue="" officialValue="" transactionId="" />
</root>

サブクエリの導入により、FOR XML 句が子の結果をネストしなくなったことがわかりますが、その理由はわかりません。

ROW_NUMBER() を介してページネーションを実装し、上記の XML の最初のブロックのように結果をフォーマットする方法を誰か教えてもらえますか?

4

2 に答える 2

1

きれいではありませんが、これはどうですか:

SELECT
    [Transactions].[ID] AS [id],
    [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
    [Transactions].[Uploaded] AS [uploaded],
    [Transactions].[Visible] AS [visible],
    [Fields].[ID] AS [fieldId],
    [Fields].[FriendlyName] AS [friendlyName],
    [Fields].[OfficialName] AS [officialName],
    [Fields].[Order] AS [order],
    [Fields].[Visible] AS [valueVisible],
    [TransactionValues].[ID] AS [valueId],
    [TransactionValues].[FieldID] AS [valueFieldId],
    [TransactionValues].[FriendlyValue] AS [friendlyValue],
    [TransactionValues].[OfficialValue] AS [officialValue],
    [TransactionValues].[TransactionID] AS [transactionId],
    [TransactionValues].idx
FROM
    [Transactions]
    INNER JOIN 
    (
        SELECT *, ROW_NUMBER() OVER(ORDER BY [TransactionValues].[ID]) AS idx
        FROM [TransactionValues]
    ) AS [TransactionValues]
        ON [TransactionValues].[TransactionID] = [Transactions].[ID]
    INNER JOIN [Fields]
        ON [TransactionValues].[FieldID] = .[Fields].[ID]
WHERE
    [Transactions].[EncryptedAccountID] = @encryptedAccountID
    AND [TransactionValues].idx BETWEEN 5 AND 20
FOR XML AUTO, ROOT('root')
于 2012-03-24T15:39:51.890 に答える
0

@Justin Pihoneyに感謝します、これが私の解決策です:

SELECT
    [Transactions].[AssignedID],
    [Transactions].[idx],
    [Transactions].[ID] AS [id],
    [Transactions].[EncryptedAccountID] AS [encryptedAccountID],
    [Transactions].[Uploaded] AS [uploaded],
    [Transactions].[Visible] AS [visible],
    [Fields].[ID] AS [id],
    [Fields].[FriendlyName] AS [friendlyName],
    [Fields].[OfficialName] AS [officialName],
    [Fields].[Order] AS [order],
    [Fields].[Visible] AS [visible],
    [TransactionValues].[ID] AS [id],
    [TransactionValues].[FieldID] AS [fieldId],
    [TransactionValues].[FriendlyValue] AS [friendlyValue],
    [TransactionValues].[OfficialValue] AS [officialValue],
    [TransactionValues].[TransactionID] AS [transactionId]
FROM
    [TransactionValues]
    INNER JOIN [Fields]
    ON [TransactionValues].[FieldID] = .[Fields].[ID]
    INNER JOIN 
    (
        SELECT *, ROW_NUMBER() OVER(ORDER BY [Transactions].[AssignedID]) AS [idx]
        FROM [Transactions]
    ) AS [Transactions]
    ON [TransactionValues].[TransactionID] = [Transactions].[ID]
WHERE
    [Transactions].[EncryptedAccountID] = @EncryptedAccountID
AND
    [Transactions].[idx] BETWEEN 5 AND 20
ORDER BY
    [Transactions].[AssignedID]
FOR XML AUTO, ROOT('root')

また、完全を期すために、「BETWEEN5AND20」パラメーターに置き換えられます。

于 2012-03-24T17:40:24.400 に答える