【问题标题】:How can i update a table using this view如何使用此视图更新表
【发布时间】:2015-02-22 19:04:37
【问题描述】:

我有 3 个表,分别称为 Airlines、Destinations 和 PriceTable。

Airlines 表有两列 - Airline_ICAO_Code 和 Airline。 Destinations 表有两列 - Airport_ICAO_Code 和 Destination。 PriceTable 有这些列 - ID、Airport_ICAO_Code、Airline_ICAO_Code、Departure、Price 和 RouteStaus。

PriceTable 中的 PK 是 ID。Airlines 表中的 PK 是 Airline_ICAO_Code。 Destinations 表中的 PK 是 Airport_ICAO_Code。价格表中的 Airport_ICAO_Code 和 Airline_ICAO_Code 列是 FK。

我创建了一个名为 InputFlightPrices 的视图,我想用它来更新存储航班价格的 PriceTable。我使用该视图执行此操作的原因是,它使我可以清楚地看到哪些航线需要更新,因为很难从代码中确定航空公司和目的地。

这是查看代码:

Create View InputFlightPrices
As
Select ID,Airline,Destination,AirportName,Price,Departure,RouteStatus
From Airlines As a
    Join PriceTable As p
On  a.Airline_ICAO_Code = p.Airline_ICAO_Code
    Join Destinations As d
    On  d.Airport_ICAO_Code = p.Airport_ICAO_Code;

我希望视图显示所有航空公司 a-z,但我不能在视图中使用 Order By 子句。

因此,我在视图上运行以下查询以在视图 A-Z 中订购航空公司

Select * from InputFlightPrices
Order By Airline Asc

上述语句生成的视图正确显示,但它不允许我编辑其中的记录以更新表格。

有解决办法吗。

感谢您提供的任何帮助。

我正在编辑这个以回应 Philpxy 试图澄清我想要什么:

  1. 我想更新一个名为 PriceTable 的表格,其中包含航班价格。
  2. PriceTable 中的 Airline 和 Destination 列包含代码。很难从这些代码中知道要更新的航空公司和目的地,所以我创建了一个名为 InputFlightPrices 的视图,它显示了航空公司和目的地的名称。这使得输入正确路线的价格变得容易。 View 的问题是 Airline 列没有排序。属于航空公司的记录分散在整个表格中。这可能会导致我错过一些需要更新的路线。
  3. 因此,我创建了一个 select 语句,按 Airline A-Z 排序视图。
  4. 我现在遇到的问题是我无法使用此视图更新 PriceTable(select 语句的结果),因为它不允许我编辑它。我尝试使用 GUI 直接单击它来进行编辑。

我希望这很清楚。

【问题讨论】:

  • 不更新视图中的记录;一个更新表中的记录。你能澄清你想做什么吗?样本数据和期望的结果是最有帮助的。
  • 你的更新代码在哪里?
  • order by 仅对查看数据很重要,您的更新语句应该具有更具体的更新行的逻辑。如果您的视图不允许您更新记录,请检查使用视图更新的限制,如果它影响多个基础表,则不能发出更新语句。
  • 至少发布view。如果视图具有 group by,则无法更新视图
  • 我编辑了上面的问题。我尝试使用 SSMS 直接在 select 语句返回的视图中编辑行。我正在使用视图来更新基础表。

标签: sql sql-server ssms


【解决方案1】:

由于您有多个连接视图,更新可能无法正确更新记录。您可以在此处使用触发器来更新表格。

【讨论】:

  • 我有多个连接,但唯一要更新的列来自 PriceTable,所以应该没问题。
【解决方案2】:

您可以根据对How to quickly edit values in table in SQL Server Management Studio? 的回答编辑您的Select * from InputFlightPrices Order By Airline Asc 查询:

在 Mgmt Studio 中,编辑前 200 名时,可以查看 SQL 窗格 - 通过右键单击网格并选择窗格-> SQL 或 通过左上角的按钮。这将允许您编写自定义 查询以深入到您要编辑的行。

转到工具 > 选项。在左侧的树中,选择 SQL Server 对象资源管理器。将选项“编辑前行命令的值”设置为 0. 它现在允许您从上下文菜单中查看和编辑整个表格。

当查询结果涉及视图时重新更新:

来自 SQL Server 2014 CREATE VIEW (Transact-SQL)

视图定义中的 SELECT 子句不能包含以下内容:

  • 一个 ORDER BY 子句,除非 SELECT 语句的选择列表中还有一个 TOP 子句

    ORDER BY 子句仅用于确定视图定义中的 TOP 或 OFFSET 子句返回的行。命令 BY 子句不保证查询视图时的有序结果, 除非在查询本身中也指定了 ORDER BY。

[...]

您可以通过视图修改基础基表的数据,如 只要满足以下条件:

  • 任何修改,包括 UPDATE、INSERT 和 DELETE 语句,都必须仅引用一个基表中的列。

[...]

一般来说, 数据库引擎必须能够明确地跟踪来自 视图定义到一个基表。

根据最后一句话:如果要更新特定行的基表,那么它必须只是一个基表的列,该基表中某些键的列必须在视图中(UNIQUE NOT NULL 或 PRIMARY KEY),并且您不得更新这些列。

否则,当您要求更新视图中的某些行时,不清楚要更新哪个基表中的哪一行。

另请参阅 SQL Server 2014 Modify Data Through a View

【讨论】:

  • 我将从视图中的 1 个表 (PriceTable) 更新 2 列。他们是出发和价格
  • 阅读有关您问题的 cmets 并将信息放入您的问题中。例如,在这里您对键一无所知,但我的回答说它们很重要。如果您不提供迄今为止帮助告诉您提供的信息,您如何期望获得更多帮助?
  • 关于“Mgmt Studio,当您编辑前 200 名时,您可以查看 SQL 窗格 - 通过右键单击网格并选择 Pane->SQL 或通过左上角的按钮。 "这仅在您使用单个表时才有效,即没有连接。一旦你开始加入 2 或 3 个表,你就不能再这样做了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多