2014-09-04 26 views
0

因此,簡單地說,我創建的視圖可從4個不同的表中檢索調查數據,但我無法控制這些表的結構,因爲它們來自第三方。SQL從視圖中的一行填充行的值

SELECT v.SurveyID, v.VoterID, v.VoteDate, a.QuestionId, a.AnswerId, 
(CASE WHEN a.questionid IN ('8', '509', '514', '516', '518', '519', '577', '723','724', '725', '726', '727', '730') 
THEN Fn_surveyconvertanswer(a.answerid, '') ELSE (CASE WHEN a.questionid IN ('758','124') AND a.answerid IN ('2631', '647') THEN CONVERT(INT, CONVERT(VARCHAR(MAX), va.answertext)) ELSE '' END) 
END) AS StoreID 
FROM Answer a 
LEFT JOIN VoterAnswers AS va ON a.AnswerId = va.AnswerID 
LEFT JOIN Voter v AS v ON va.VoterID = v.VoterID 
LEFT JOIN Question q AS q ON a.QuestionId = q.QuestionId 

現在說,當說QuestionID是在我還需要與STOREID列只能發現(「3」,「43」,「55」),那麼每個answerID =一定的商店(實際上另一個是有表answerID鏈接到STOREID但這是無關的問題)。如果我使用一個case語句來找到它,它只會顯示爲一排,這意味着該意見表看起來像

+----------+---------+----------+------------+----------+---------+ 
| SurveyID | VoterID | VoteDate | QuestionId | AnswerID | StoreID | 
+----------+---------+----------+------------+----------+---------+ 
|  5 |  1 | 9/4/2014 |   1 |  52 |  0 | 
|  5 |  1 | 9/4/2014 |   2 |  43 |  0 | 
|  5 |  1 | 9/4/2014 |   3 |  78 |  97 | 
|  5 |  1 | 9/4/2014 |   4 |  87 |  0 | 
|  5 |  1 | 9/4/2014 |   5 |  98 |  0 | 
+----------+---------+----------+------------+----------+---------+ 

由於所有調查數據都是針對該商店的,因此我如何獲得storeID 97的所有行?

EX。

+----------+---------+----------+------------+----------+---------+ 
| SurveyID | VoterID | VoteDate | QuestionId | AnswerID | StoreID | 
+----------+---------+----------+------------+----------+---------+ 
|  5 |  1 | 9/4/2014 |   1 |  52 |  97 | 
|  5 |  1 | 9/4/2014 |   2 |  43 |  97 | 
|  5 |  1 | 9/4/2014 |   3 |  78 |  97 | 
|  5 |  1 | 9/4/2014 |   4 |  87 |  97 | 
|  5 |  1 | 9/4/2014 |   5 |  98 |  97 | 
+----------+---------+----------+------------+----------+---------+ 

我就做左側努力加入上基本上與上述相同的查詢上VoterID(因爲這也是拍攝的每張調查是唯一的),並做一些分組,但現在有喜歡STOREID多個字段上方雲集同樣的方式。它開始變得混亂,實際上在保存爲視圖時會導致一些奇怪的分組錯誤。 (奇怪的工作正常,作爲一個獨立的查詢)我想知道是否有更好的更有效的方式來填充其餘的行與商店ID

我已經使用臨時表這樣的東西在過去與偉大結果,但不能在視圖中使用它們。

+0

怎麼樣DDL和樣本數據? sqlfiddle.com將是一個很好的開始。 – 2014-09-04 15:27:29

+0

用子查詢填充storeID。 – 2014-09-04 15:29:36

+0

嗯,當我意識到必須有更好的方法時,我正在爲StoreID做子查詢,因爲還有其他類似的字段,所以我最終會爲每一行做大約5個子查詢。 – RustyH 2014-09-04 15:33:28

回答

1

使用WITH語句添加CTE查詢並將它們連接到您的視圖,而不是使用內嵌式子查詢。

更好的是,您應該插入缺失的行,以便您將所有記錄加入相應的商店。

一個比較另類的是,如果你把它設置爲0來使用MAX(),它丟失:

MAX(<ShopId case clause>) OVER() as ShopId 
+0

storeID是從一個案例的統計,我上面提到的。 – RustyH 2014-09-04 15:36:17

+0

我正在調查CTE查詢,我想我可以弄清楚,但你能否詳細說明你的意思是插入缺失的行嗎? – RustyH 2014-09-04 15:55:09

+0

至於提供完整的工作SQL它現在混亂,這就是爲什麼我正在重新創建它,我會嘗試只得到一個工作示例 – RustyH 2014-09-04 15:57:40