【发布时间】:2022-01-15 13:23:42
【问题描述】:
我在将所有这些整合在一起时遇到了一些问题。
我正在使用 Microsoft SQL Server。
我从 3 张桌子开始。
表 #1 - 人员
| PersonId | Name |
|---|---|
| 1 | Doug |
| 2 | Mary |
| 3 | Mike |
| 4 | Tim |
| 5 | Hank |
表 #2 - FoodTransaction
| FoodTransactionId | PersonId | Cost |
|---|---|---|
| 1 | 1 | 50 |
| 2 | 1 | 80 |
| 3 | 2 | 15 |
| 4 | 3 | 25 |
| 5 | 3 | 30 |
表 #3 - EntertainmentTransaction
| EntertainmentTransactionId | PersonId | Cost |
|---|---|---|
| 1 | 2 | 10 |
| 2 | 2 | 80 |
| 3 | 3 | 15 |
| 4 | 4 | 25 |
| 5 | 4 | 45 |
| 6 | 4 | 30 |
从这里开始,我的目标是制作一个汇总表或视图,包括每个人以及按交易类型划分的交易总和。
为了制作下面的视图,我确实选择了一系列子选择。
-
我从 Person 表和 FoodTransaction 表之间的完全外部联接开始。我创建了一个新字段 sum(FoodTransaction.Cost) 作为 FoodTotal。
-
然后我在这些结果和 EntertainmentTransaction 表之间进行左连接,在该表中我创建了一个新字段 sum(EntertainmentTransaction.Cost) 作为 EntertainmentTotal。
-
然后我添加一个 where 子句,说明 FoodTotal 不为 null 或 EntertainmentTotal 不为 null。这个 where 子句从 Person 表中删除所有在任一表上都没有事务的条目。
我已经根据上述条件成功创建了下表。
查看 #1 - 交易摘要
| PersonId | FoodTotal | EntertainmentTotal |
|---|---|---|
| 1 | 130 | |
| 2 | 15 | 90 |
| 3 | 55 | 15 |
| 4 | 100 |
我的最后一个障碍在下面。我有一个可编辑的评论表,我想加入到视图中。
表 #4 - 注释
| CommentId | PersonId | Comment |
|---|---|---|
| 1 | 1 | Here's a comment. |
| 2 | 2 | This is another comment. |
| 3 | 3 | How about this comment? |
| 4 | 4 | I like to comment. |
| 5 | 5 |
下面的 View 是将 Comment 表连接回 View #1 的结果
查看 #2 - TransactionSummaryComment
| PersonId | FoodTotal | EntertainmentTotal | Comment |
|---|---|---|---|
| 1 | 130 | Here's a comment. | |
| 2 | 15 | 90 | This is another comment. |
| 3 | 55 | 15 | How about this comment? |
| 4 | 100 | I like to comment. |
这一切都有效。目标是显示此视图并允许用户编辑评论字段。
问题是,如果我从 View #2 中编辑其中一个 cmets,我会收到以下错误:
“无法更新视图或函数,因为它包含聚合、DISTINCT 或 GROUP BY 子句、PIVOT 或 UNPIVOT 运算符。”
这让我认为,由于创建了聚合字段,我正在做的事情不会像这样工作。
我想一定有一种方法可以达到与我尝试过的方法不同的预期结果。
任何关于实现这一目标的更有效方式的想法或建议将不胜感激。
【问题讨论】:
-
您可以创建两个视图,第一个聚合,第二个将第一个视图与 cmets..然后 cmetstext 列在第二个视图上可更新..dbfiddle.uk/…
-
..或将聚合放在视图中的派生/子查询中。dbfiddle.uk/…
标签: sql sql-server join view aggregate