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')

此外,为了完整起见,“BETWEEN 5 AND 20”被参数替换。

于 2012-03-24T17:40:24.400 回答