我有3个名为Airlines,Destinations和PriceTable的表。
航空公司表格有两列 - Airline_ICAO_Code和航空公司。 Destinations表有两列 - Airport_ICAO_Code和Destination。 PriceTable包含以下列:ID,Airport_ICAO_Code,Airline_ICAO_Code,Departure,Price和RouteStaus。
PriceTable中的PK是ID。航空公司表中的PK是Airline_ICAO_Code。目的地表中的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试图澄清我想要的东西:
我希望那清楚。
答案 0 :(得分:0)
由于视图中有多个联接,更新可能无法正确更新记录。您可以在此处使用触发器来更新表格。
答案 1 :(得分:0)
您可以根据How to quickly edit values in table in SQL Server Management Studio?的答案编辑Select * from InputFlightPrices Order By Airline Asc
查询:
在Mgmt Studio中,当您编辑前200名时,您可以查看SQL 窗格 - 通过右键单击网格并选择Pane-> SQL或 通过左上角的按钮。这将允许您编写自定义 查询以深入查看要编辑的行。
转到工具>选项。在左侧的树中,选择SQL Server 对象浏览器。将“编辑顶行命令的值”选项设置为 现在,它允许您从上下文菜单中查看和编辑整个表格。
查询结果涉及视图时重新更新:
来自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。