2011-04-25 30 views
5

tôi phải lật số hiệu chuyến bay cho các chuyến bay của cặp đi tới đi lui từ một tập các thành phố, vì vậy ví dụ:Làm cách nào để trao đổi giá trị của bản ghi trong Oracle SQL?

1439 ATL SFO
1440 SFO ATL

sẽ kết thúc như:

1440 ATL SFO
1439 SFO ATL

tôi đã cố gắng truy vấn này (vì bạn không thể cập nhật .. JOIN trong 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; 

nơi hãng hàng không, flightno là khóa chính cho các chuyến bay trên bàn. Lựa chọn này cung cấp cho tôi tập hợp các bản ghi chính xác mà tôi muốn hoán đổi, nhưng UPDATE ... SET cho tôi lỗi này:

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 

Bất kỳ ý tưởng nào về việc tôi sẽ sai ở đâu?

+0

@therin Hãy thử thêm ràng buộc các chuyến bay thay đổi bảng thêm ràng buộc flight_uk duy nhất (flightno); –

+0

Thêm ràng buộc vào chế độ xem g mà tôi đã tạo? Tôi không chắc ý bạn là gì. Tôi đã thử thêm một ràng buộc khác vào bảng chuyến bay, nhưng một trong những vấn đề chính khác mà tôi đã giải quyết là tôi không thể thêm một ràng buộc duy nhất trên số hiệu chuyến bay, có thể có số chuyến bay giống hệt cho một hãng hàng không khác . – therin

+0

@therin Đó là vấn đề bạn đang gặp phải vì bạn có số hiệu chuyến bay giống nhau, nó không thể cập nhật –

Trả lời

6

Để cập nhật tham gia, không quan trọng là tập dữ liệu bạn chọn sẽ xảy ra để được bảo toàn khóa hiệu quả; Oracle phải có khả năng nhìn thấy từ các ràng buộc và các biến vị ngữ mà nó sẽ theo định nghĩa được giữ nguyên khóa. Và bởi vì bạn có một điều kiện bất bình đẳng trên flightnumber, không có gì trong định nghĩa dữ liệu để đảm bảo rằng bạn sẽ không có nhiều kết quả phù hợp cho một hàng nguồn nhất định.

Nếu đảm bảo rằng số chuyến bay sẽ luôn khác nhau 1, bạn có thể sử dụng phương thức kết hợp nếu bạn thay đổi điều kiện thành d.flightno + 1 = f.flightno.

Trong mọi trường hợp, tôi cho rằng những điều sau đây sẽ hoạt động ... vì truy vấn đọc mức độ nhất quán truy vấn con nên trả lại kết quả chính xác ngay cả khi các hàng được cập nhật.

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; 
+0

Điều này hoạt động hoàn hảo, cảm ơn bạn – therin

Các vấn đề liên quan