Tôi mới trong PostgreSQL và đang cố chuyển đổi truy vấn từ SQL Server.Cập nhật Postgres từ bên trái tham gia
Tôi có một bảng Người dùng với, trong số những người khác, các cột bUsrActive, bUsrAdmin và sUsrClientCode. Tôi muốn cập nhật người dùng và đặt bUsrActive = false nếu không tồn tại một người dùng khác có cùng sUsrClientCode trong đó bUsrAdmin = true và bUsrActive = true.
Trong SQL Server Tôi có truy vấn này
UPDATE u SET u.bUsrActive = 0
FROM Users u
LEFT JOIN Users u2 ON u.sUsrClientCode = u2.sUsrClientCode AND u2.bUsrAdmin = 1 AND u2.bUsrActive = 1
WHERE u.bUsrAdmin = 0 AND u.bUsrActive = 1 AND u2.nkUsr IS NULL
Tôi đang cố gắng để chuyển đổi này để postgres. Tôi đã viết 3 cách tiếp cận.
1) Lần thử đầu tiên của tôi. Rõ ràng là không hoạt động.
UPDATE Users u
SET bUsrActive = false
FROM Users u2
WHERE u.sUsrClientCode = u2.sUsrClientCode AND u2.bUsrAdmin = true AND u2.bUsrActive = true
AND u.bUsrAdmin = false AND u.bUsrActive = true AND u2.nkUsr IS NULL;
2) Tôi hiểu tại sao nó không hoạt động (cập nhật tất cả người dùng). Tôi chỉ không thể tìm ra làm thế nào tôi có thể tham khảo người dùng bảng u trong phần UPDATE ... SET.
UPDATE Users
SET bUsrActive = false
FROM Users u
LEFT JOIN Users u2 ON u.sUsrClientCode = u2.sUsrClientCode AND u2.bUsrAdmin = true AND u2.bUsrActive = true
WHERE u.bUsrAdmin = false AND u.bUsrActive = true AND u2.nkUsr IS NULL;
3) Phần sau đây hoạt động nhưng không sử dụng kết nối.
UPDATE Users
SET bUsrActive = false
WHERE NOT EXISTS (
SELECT 1
FROM Users u
WHERE u.sUsrClientCode = Users.sUsrClientCode AND u.bUsrAdmin = true AND u.bUsrActive = true
) AND Users.bUsrAdmin = false AND Users.bUsrActive = true;
Tôi có thể sẽ đi với giải pháp cuối cùng. Tôi chỉ muốn biết nếu nó có thể làm những gì tôi muốn bằng cách sử dụng một tham gia trái.
Điều gì xảy ra với phiên bản thứ ba? –
Không có gì, nó hoạt động. Chỉ cần tự hỏi nếu tôi có thể làm điều đó theo cách khác bằng cách sử dụng tham gia. Có vẻ đẹp hơn cho mắt! Tôi đoán hiệu suất sẽ giống nhau. – alfoks
Cách thứ hai sẽ hoạt động (ngay từ cái nhìn đầu tiên) lỗi bạn nhận được là gì ?. Bạn có biết rằng ngữ nghĩa của mệnh đề 'FROM' khác trong PostgreSQL so với SQL Server không? –