如何在Oracle SQL中交换记录值?

前端之家收集整理的这篇文章主要介绍了如何在Oracle SQL中交换记录值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我应该为来自一组城市的来回飞行的航班号翻转航班号,例如:

1439 ATL SFO
1440 SFO ATL

最终会:

1440 ATL SFO
1439 SFO ATL

我试过这个查询(因为你不能在Oracle中更新..加入):

UPDATE
   (SELECT f.airline,f.flightno flightno_f,d.airline,d.flightno flightno_d
       FROM flights f
       INNER JOIN flights d ON f.airline = 9 AND
         f.sourceairport = d.destairport AND
         f.destairport = d.sourceairport AND d.airline = 9
       WHERE d.flightno < f.flightno) g
   SET g.flightno_f = g.flightno_d,g.flightno_d = g.flightno_f;

航空公司,flightno是表航班的主要钥匙. select给了我想要交换的正确记录集,但是UPDATE … SET给了我这个错误

SET g.flightno_f = g.flightno_d,*
ERROR at line 7:
ORA-01779: cannot modify a column which maps to a non key-preserved table

关于我哪里出错的任何想法?

解决方法

为了更新连接,您选择的数据集恰好是密钥保留的并不重要; Oracle必须能够从约束和谓词中看出它将根据定义进行密钥保留.并且因为您在flightnumber上存在不等式条件,所以数据定义中没有任何内容可以保证您不会为给定的源行提供多个匹配项.

如果保证航班号总是相差1,那么如果将条件更改为d.flightno 1 = f.flightno,则可以使用join方法.

在任何情况下,我认为以下内容将起作用…由于语句级读取一致性,子查询应该返回正确的结果,即使行更新.

UPDATE flights f1
  SET flightno =
    (SELECT flightno
       FROM flights f2
       WHERE f2.airline = f1.airline
         AND f2.sourceairport = f1.destairport
         AND f2.destairport = f1.sourceairport
    )
  WHERE airline = 9;

猜你在找的Oracle相关文章