PL/SQL - 如何通过与另一个 table 进行比较找出 table 中缺失的值

PL/SQL - How to find out values missing from table by comparing to another table

我通过在游戏战舰上使用基本的 10x10(-5 到 5)网格系统来构建我使用 SQL 的知识,以确定哪些网格可以避免在一系列游戏中被击中。

我提出了以下查询,将板上的 X 和 Y 网格 (game) 与包含 -5 到 5 的 11 行(包括 0 ) 每个轴使用的数字 (grid_format)。我已经插入了 9 行测试数据(其中一些在同一个网格上)。

结果应该 return 大约 114 行,而我只得到 49 行。单独地,x_coordy_coord 查询 return 7 行,不包括在 game 上使用的行,这意味着它正在工作。问题在于将它们放在一起,其中省略了整个 y_coord 个网格。

这两个查询都给了我相同的结果。请问有人能帮我解决这个难题吗?

-- Table
CREATE TABLE game(
x_coord NUMBER(2,0),
y_coord NUMBER(2,0));

INSERT INTO game VALUES (4,4);
INSERT INTO game VALUES (1,-4);
INSERT INTO game VALUES (0,0);
INSERT INTO game VALUES (0,0);
INSERT INTO game VALUES (1,-5);
INSERT INTO game VALUES (1,-5);
INSERT INTO game VALUES (-2,4);
INSERT INTO game VALUES (1,-5);
INSERT INTO game VALUES (0,0);

CREATE TABLE grid_format(
grid NUMBER(2,0));

INSERT INTO grid_format VALUES (-5);
INSERT INTO grid_format VALUES (-4);
INSERT INTO grid_format VALUES (-3);
INSERT INTO grid_format VALUES (-2);
INSERT INTO grid_format VALUES (-1);
INSERT INTO grid_format VALUES (-0);
INSERT INTO grid_format VALUES (1);
INSERT INTO grid_format VALUES (2);
INSERT INTO grid_format VALUES (3);
INSERT INTO grid_format VALUES (4);
INSERT INTO grid_format VALUES (5);

-- Query

SELECT X_Grid, Y_Grid
FROM
(SELECT grid AS Y_Grid
FROM grid_format
WHERE
    NOT EXISTS (
        SELECT *
        FROM game
        WHERE game.y_coord = grid_format.grid)),
(SELECT grid AS X_Grid 
FROM grid_format
WHERE
    NOT EXISTS (
        SELECT *
        FROM game
        WHERE game.x_coord = grid_format.grid)
 ORDER BY X_Grid DESC);


 -- Alternative Solution


SELECT X_Grid, Y_Grid
FROM
   (SELECT grid AS X_Grid
   FROM grid_format
MINUS
   SELECT x_coord
   FROM game),
   (SELECT grid AS Y_Grid
   FROM grid_format
MINUS
   SELECT y_coord
   FROM game)

以下是测试结果(参见 link):

Result from query

谢谢。

你可以使用类似的东西:

WITH 
  xaxis AS (SELECT grid AS x FROM grid_format),
  yaxis AS (SELECT grid AS y FROM grid_format),
  grid  AS (SELECT x, y FROM xaxis, yaxis)
SELECT *
  FROM grid
  LEFT JOIN game 
    ON grid.x = game.x_coord
   AND grid.y = game.y_coord;

其中 returns 所有网格位置 (x,y),如果有船,X_COORD 和 Y_COORD 中的值,类似于

 X   Y   X_COORD   Y_COORD
 3   3   3         3
-5   2      
-2   5      
 3  -5      
-2  -4      

编辑:

您甚至可以用

之类的东西以图形方式显示网格
WITH 
  xaxis AS (SELECT grid AS x_coord FROM grid_format),
  yaxis AS (SELECT grid AS y_coord FROM grid_format),
  grid  AS (SELECT x_coord, y_coord FROM xaxis, yaxis),
  grid2 AS (SELECT x_coord, y_coord, NVL2(game.rowid,1,0) as ship
             FROM grid LEFT JOIN game USING(x_coord, y_coord))
SELECT * 
  FROM grid2
 PIVOT (sum(ship) 
        FOR x_coord IN (-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5))
 ORDER BY y_coord;

 -5  0  0  0  0  0  0  0  0  0  0  0
 -4  0  0  0  0  0  0  0  0  0  0  0
 -3  0  0  0  0  0  0  0  0  0  0  0
 -2  0  0  0  0  0  0  0  0  0  0  0
 -1  0  0  0  0  0  0  0  0  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0
  1  0  0  0  0  0  0  0  0  0  0  0
  2  0  0  0  0  0  0  0  0  0  0  0
  3  0  0  0  0  0  0  0  0  1  0  0
  4  0  0  0  0  0  0  0  0  0  0  0
  5  0  0  0  0  0  0  0  0  0  0  0