我有下表
CREATE TABLE holes (`tournament_id` INTEGER, `year` INTEGER, `course_id` INTEGER, `round` INTEGER, `hole` INTEGER, `front` INTEGER, `side` INTEGER, `region` INTEGER);
用下面的数据示例
INSERT INTO holes (`tournament_id`, `year`, `course_id`, `round`, `hole`, `front`, `side`, `region`) VALUES
('33', '2016', '895', '1', '1', '12', '5', 'L'),
('33', '2016', '895', '1', '2', '18', '10', 'R'),
('33', '2016', '895', '1', '3', '15', '7', 'R'),
('33', '2016', '895', '1', '4', '11', '7', 'R'),
('33', '2016', '895', '1', '5', '18', '7', 'L'),
('33', '2016', '895', '1', '6', '28', '5', 'L'),
('33', '2016', '895', '1', '7', '21', '12', 'R'));
此外,我还有另一个表tournaments
CREATE TABLE tournaments (`tournament_id` INTEGER, `year` INTEGER, `R1` INTEGER, `R2` INTEGER, `R3` INTEGER, `R4` INTEGER);
带数据
INSERT INTO tournaments VALUES
(33, 2016, 715, 715, 895, 400);
R1
、R2
、R3
和R4
的值表示课程的ID。我希望基于表tournaments
的所有可能值,在表 holes 中 missing 的列tournament_id
、year
和course_id
。在此answer的帮助下,我尝试了以下操作:
WITH h AS (
SELECT DISTINCT tournament_id, year, course_id
FROM holes)
SELECT t.tournament_id, t.year
FROM tournaments t
WHERE NOT EXISTS (
SELECT *
FROM h
WHERE h.tournament_id = t.tournament_id
AND h.year = t.year
AND h.course_id IN (t.R1, t.R2, t.R3, t.R4)
);
demo
以上是一个很长的路要走,但我也希望是/是失踪的h.course_id
。期望的结果:
33 2016 715
33 2016 400
tournament_id、year和course_id的这些组合不存在于holes
中。但是,它们确实存在,因为它们存在于tournaments
中。
1条答案
按热度按时间uemypmqf1#
对于此要求,您需要一个由
Rx
列的所有值组成的结果集,您可以在CTE
中使用UNION
来获取这些值。然后,您可以使用
NOT EXISTS
来获取holes
中不存在的id
、year
和course
的所有组合:请参阅demo。