2017-07-19 80 views
1

我有一個數據庫設置爲存儲從我創建看起來像這樣的每一個Web表單中的所有輸入:如何使用基於集合的SQL我的查詢

(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,我需要一些幫助。我想知道是否有一種簡單而有效的方式來使用基於集合的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 

此表中的每一列都有一個對應的FormFieldId在FORMDATA表。例如,FormData表中的FormFieldId(191)對應於TSERequests表中的列(DateCreated)。

+0

我不清楚你在問什麼。根據你提供的查詢,你需要一個'INSERT'或'UPDATE'到'FormData'嗎?如果是這樣,你可以寫一個 - 既支持'FROM'和連接。 (但這將是一個自聯接,因此使用公用表表達式更加方便。) –

+0

我需要對TSERequests表進行INSERT。 FormData中的每個FormFieldId在TSERequests中都有相應的列。 –

+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 
+0

感謝您的回覆。我嘗試過使用數據透視表,但是我遇到的問題是,如果其中一個值恰好爲null,則FormFieldId不匹配TSERequests中的右列。 –

+0

什麼版本的SQL?結果數據透視表應該爲選擇列表中的每個值列出一列,即使所有值都爲空。我不確定爲什麼這會與目標不一致。 – Greenspark

+0

我想出了我的問題。我試圖使用ROW_NUMBER()來代替FormFieldId。你的答案完美無缺。非常感謝你! –