如何使用此视图更新表

时间:2015-02-21 17:19:02

标签: sql sql-server ssms

我有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试图澄清我想要的东西:

  1. 我想更新一个名为PriceTable的表,其中包含航班价格。
  2. PriceTable中的航空公司和目的地列包含代码。很难从这些代码中了解要更新的航空公司和目的地,因此我创建了一个名为InputFlightPrices的视图,其中显示了航空公司和目的地名称。这样可以轻松输入正确路线的价格。 View的问题是Airline列未排序。属于航空公司的记录分散在整个表格中。这可能会导致我错过一些需要更新的路线。
  3. 因此,我创建了一个选择声明,按航空公司A-Z订购观点。
  4. 我现在遇到的问题是我无法使用此View(select语句的结果)更新PriceTable,因为它不允许我编辑它。我尝试通过使用GUI直接单击来编辑。
  5. 我希望那清楚。

    Table examples

2 个答案:

答案 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