连接两个表的值,这些值表示SQLITE中这两个表之间缺少的值

mpbci0fu  于 2022-12-04  发布在  SQLite
关注(0)|答案(1)|浏览(135)

我有下表

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);

R1R2R3R4的值表示课程的ID。我希望基于表tournaments的所有可能值,在表 holesmissing 的列tournament_idyearcourse_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中。

uemypmqf

uemypmqf1#

对于此要求,您需要一个由Rx列的所有值组成的结果集,您可以在CTE中使用UNION来获取这些值。
然后,您可以使用NOT EXISTS来获取holes中不存在的idyearcourse的所有组合:

WITH cte AS (
  SELECT id, year, R1 AS course FROM tournaments 
  UNION 
  SELECT id, year, R2 FROM tournaments 
  UNION 
  SELECT id, year, R3 FROM tournaments 
  UNION 
  SELECT id, year, R4 FROM tournaments
)
SELECT c.*
FROM cte c
WHERE NOT EXISTS (
  SELECT *
  FROM holes h
  WHERE (h.id, h.year, h.course) = (c.id, c.year, c.course)
);

请参阅demo

相关问题