SQL 用视图中一行的值填充行

Posted

技术标签:

【中文标题】SQL 用视图中一行的值填充行【英文标题】:SQL fill rows with value from one row in a view 【发布时间】:2014-09-04 15:20:59 【问题描述】:

所以简单地说我正在创建一个从 4 个不同表中检索调查数据的视图,我无法控制这些表的结构,因为它们来自第 3 方。

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

现在说我还需要一个带有 StoreID 的列,只有在说 QuestionID 位于 ('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,以相同的方式收集。它开始变得一团糟,当另存为视图时实际上会导致一些奇怪的分组错误。 (奇怪的是,作为一个独立的查询可以正常工作)我想知道是否有更好更有效的方法来使用 storeID 填充其余行

我过去曾使用临时表来处理类似的事情,效果很好,但不能在视图中使用它们。

【问题讨论】:

一些ddl和样本数据怎么样? sqlfiddle.com 将是一个很好的起点。 使用子查询填充 storeID。 好吧,当我意识到必须有更好的方法时,我正在对 StoreID 进行子查询,因为还有其他类似的字段,所以我最终会为每个单独的查询做大约 5 个子查询行。 我认为你所说的无关紧要的部分是开发替代解决方案的最重要部分。 【参考方案1】:

使用 WITH 语句添加 CTE 查询并将它们加入到您的视图中,而不是使用内联子查询。

最好插入缺失的行,以便将所有记录连接到相应的商店。

另一种选择是使用 MAX() 如果你将它设置为 0 缺少它:

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

【讨论】:

storeID 是根据case statment 计算出来的,我在上面提到过。 我正在研究 CTE 查询,我想我可以弄清楚,但您能否详细说明插入缺失行的含义? 就提供完整的工作 SQL 而言,它现在一团糟,这就是我重新创建它的原因,我将尝试获得一个工作示例 只有一行有storeid对应的问题 啊,我知道我最后可能必须实际定义一个分区,因此它不仅返回最大 storeID,而且返回该特定调查的最大 storeID

以上是关于SQL 用视图中一行的值填充行的主要内容,如果未能解决你的问题,请参考以下文章

每次关闭时如何重置视图?

按顺序用 sqlite 数据库中的表行填充表视图部分

在 SQL Server 视图中插入重复行

用从子视图调用的视图填充 iphone 屏幕

为 javaFx 表视图中的每一行动态填充组合框列表

单击一行时使用表格视图数据填充文本字段