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

时间:2017-07-19 13:55:48

标签: sql-server loops set-based

我有一个数据库设置来存储我创建的每个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

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

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,并将每个数据单独设置到我的新表中的相应字段,但我们都知道这需要多长时间。

我仍然是SQL的新手,我需要一些帮助。我想知道是否有一种简单有效的方法来使用基于set的SQL而不是过程SQL来执行它。

编辑: 要清楚,这就是TSERequests的样子(我试图插入的表格)

(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

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

1 个答案:

答案 0 :(得分:2)

我相信你想要呈现你的数据,所以具有相同密集等级的所有字段将被放置在目标表的一行中,并且字段将被列为列。如果是这样,那么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