Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在我的查询中使用基于集合的SQL_Sql Server_Loops_Set Based - Fatal编程技术网

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

Sql server 如何在我的查询中使用基于集合的SQL,sql-server,loops,set-based,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 uniqueidentifie

我建立了一个数据库,用于存储我创建的每个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
(Data)       |     (FormFieldId)    |    (RequestRanking)
-------------+----------------------+--------------------
TestData1    |     191              |    1
TestData2    |     192              |    1
TestData3    |     193              |    1
   ...       |     ...              |   ...
TestData20   |     269              |    1
TestData21   |     191              |    2
TestData22   |     192              |    2
TestData23   |     193              |    2
我需要查询这个数据库来选择特定于web表单的字段,并将它们存储在一个名为TSERequests的单独表中。因为FormFieldID是特定于表单的,所以不需要担心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)
此查询向我提供如下结果:

(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
(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新手,需要一些帮助。我想知道是否有一种简单有效的方法可以使用基于集合的SQL而不是过程SQL来执行此操作

编辑: 清楚地说,这就是我试图插入的表的外观

(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表中创建的列Date。

我相信您希望显示数据,以便将具有相同密集等级的所有字段放置在目标表中的一行中,并将字段列示为列。如果是这样,那么枢轴将完成这一点

;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

我不清楚你在问什么。您是否需要根据所提供的查询插入或更新FormData?如果是这样的话,您可以只编写一个,包括来自和联接的支持。但这将是一个自连接,因此使用公共表表达式更加方便。FormData中的每个FormFieldId在请求中都有一个对应的列。我将编辑我的帖子,以显示我的其他数据库的外观。谢谢,这一编辑对于理解您真正想要的是什么非常必要。很抱歉造成混淆。谢谢您的回复。我曾尝试使用pivot,但遇到的问题是,如果其中一个值恰好为null,则FormFieldID与TSERequests中的正确列不匹配。SQL的哪个版本?结果透视应该为选择列表中的每个值列出一列,即使所有值都为空。我不知道为什么这会与目标不一致。我解决了我的问题。我试着用行号而不是FormFieldId来透视。你的答案很正确。非常感谢你!