Tôi đã chuẩn bị an SQL Fiddle cho câu hỏi của mình.Tìm tổng giá trị tối đa trong một truy vấn SELECT duy nhất
Trong một trò chơi chữ tôi chạy a custom function để tìm tất cả các từ được chơi bởi một người dùng trong lượt cuối cùng của cô:
từ không hợp lệ có score
của NULL
(có thể được thay đổi để -1
nếu cần thiết).
Từ hợp lệ có dương score
và nếu có một số từ phù hợp, thì tôi chỉ cần điểm cao nhất (và loại bỏ điểm số khác). Ví dụ: nếu người chơi chơi từ ngang "ab" với điểm 8 và từ dọc "ab" với điểm số 2, thì cô ấy chỉ nhận được 8 điểm cho lượt đó.
Dưới đây là bảng thử nghiệm của tôi:
CREATE TABLE words(word varchar, score integer);
Và ở đây tôi điền vào nó với dữ liệu thử nghiệm:
INSERT INTO words (word, score) VALUES
('ab', 8), -- word with higher score should be taken
('ab', 2), -- same word with lower score should be discarded
('xy', 2),
('zz', NULL); -- invalid word marked by NULL (or -1)
tôi có thể thấy nếu một từ không hợp lệ đã được chơi bởi
IF EXISTS (SELECT 1 FROM words WHERE score IS NULL) THEN
RAISE EXCEPTION 'Invalid word played';
END IF;
Và tôi có thể xóa các từ trùng lặp bằng GROUP BY
:
SELECT word, max(score) as score FROM words GROUP BY word;
Câu hỏi của tôi là tuy nhiên:
Làm thế nào để kết hợp cả hai câu lệnh trên để một SELECT
tuyên bố duy nhất, vì vậy mà tôi:
- biết nếu một từ không hợp lệ đã được chơi
- Tổng số điểm đã chơi (để tôi có thể cập nhật điểm số của người chơi)
Tôi đang tìm một câu lệnh duy nhất, để the custom function không chạy nhiều lần và tốt nhất là không có bảng tạm thời.
Kết quả sẽ giống như thế (tôi sẽ gọi nó là từ tùy chỉnh khác PL/pgSQL chức năng):
DECLARE
total_user_score integer;
invalid_words_found boolean;
SELECT
....., -- how to calculate this value please?
..... -- how to calculate this value please?
INTO STRICT
total_user_score,
invalid_words_found
FROM words_check_words(....); -- avoid calling this function twice
IF invalid_words_found THEN
RAISE EXCEPTION "Invalid words found";
ELSE
UPDATE games SET user_score = user_score + total_user_score;
END IF;
Yes. từ không hợp lệ luôn có cùng số điểm NULL (hoặc -1) –
OK, trong giải pháp này nó phải là NULL (không -1). Nếu -1 có thể xảy ra, SQL sẽ cần một chút thích ứng. Bạn có cần điều đó không? – trincot
Không, tất cả các điểm tốt đều dương. Cảm ơn bạn vì câu trả lời! –