如何在我的查询中使用基于集合的 SQL

How to use set-based SQL in my query

我设置了一个数据库来存储我创建的每个 Web 表单的所有输入,如下所示:

(FormData)
----------------------
(PK) Id int not null,
(FK) FormFieldId int not null,
(FK) FormId int not null,
     Data varchar(max) null,
     DateSubmitted datatime not null,
(FK) SubmissionId uniqueidentifier not null

我需要查询此数据库以 select 特定于 Web 表单的字段并将它们存储在单独的 table 称为 TSERequests 中。由于 FormFieldIds 特定于表单,因此无需担心 FormId。为了 select 我需要的所有数据,我使用了一个简单的查询:

SELECT Data, FormFieldId,
DENSE_RANK() OVER (ORDER BY DateSubmitted desc) AS RequestRanking
FROM FormData
WHERE FormFieldId IN (191, 192, 193, 194, 195, 196, 197, 198, 205, 208, 213, 
216, 217, 218, 219, 220, 242, 243, 244, 269)

这个查询给了我这样的结果:

(Data)       |     (FormFieldId)    |    (RequestRanking)
-------------+----------------------+--------------------
TestData1    |     191              |    1
TestData2    |     192              |    1
TestData3    |     193              |    1
   ...       |     ...              |   ...
TestData20   |     269              |    1
TestData21   |     191              |    2
TestData22   |     192              |    2
TestData23   |     193              |    2

RequestRanking 会随着它找到的每个新请求而递增。我知道我可以使用游标或 while 循环遍历每个 RequestRanking 并将每条数据分别设置到我的新 table 中的相应字段,但我们都知道这需要多长时间。

我对 SQL 还是很陌生,我需要一些帮助。我想知道是否有一种简单有效的方法可以使用基于集合的 SQL 而不是程序 SQL.

来执行此操作

编辑: 需要明确的是,这就是 TSERequests 的样子(我试图插入的 table)

(TSERequests)
-----------------------------
(PK) RequestId int not null,
     DateCreated date not null,
     Name varchar(100) not null,
     StreetAddress varchar(100) null,
     City varchar(100) null,
     State int null,
     ZipCode varchar(10) null,
     PhoneNumber varchar(15) null,
     EmailAddress varchar(100) null,
     RequestStartDate date not null,
     RequestEndDate date not null,
     RequestStatus int null

此 table 中的每一列在 FormData table 中都有对应的 FormFieldId。例如,FormData table 中的 FormFieldId (191) 对应于 TSERequests table.

中的列 (DateCreated)

我相信您想要呈现您的数据,因此具有相同密集排名的所有字段将在您的目标 table 中放置在一行中,并且这些字段将列为列。如果是这样,那么 PIVOT 将完成此任务。

;WITH myDataSet AS
(
    SELECT Data, FormFieldId,
    DENSE_RANK() OVER (ORDER BY DateSubmitted desc) AS RequestRanking
    FROM FormData
    WHERE FormFieldId IN (191, 192, 193, 194, 195, 196, 197, 198, 205, 208, 213, 
    216, 217, 218, 219, 220, 242, 243, 244, 269)
)
SELECT
    RequestRanking, [191], [192], [193], [194], [195], [196], [197], [198], [205], [208], [213], 
    [216], [217], [218], [219], [220], [242], [243], [244], [269]
FROM
(
    SELECT data, FormFieldId, RequestRanking From myDataSet ) as sourceData

    PIVOT
    (
        Max(data)
        FOR FormFieldID in ([191], [192], [193], [194], [195], [196], [197], [198], [205], [208], [213], 
                            [216], [217], [218], [219], [220], [242], [243], [244], [269])
    ) AS PivotTable