在网格中查找空位置

时间:2017-09-01 12:41:36

标签: oracle11g set-theory

SORT表中,项目存储在X,Y坐标中:

Contents

假设容器大小为3乘3.我希望找到给定容器中的哪些位置是空闲的。到目前为止,我已经生成了一个2D矩阵:

Contents
-------
id
parent_id
pos_x
pos_y

然后我尝试SELECT * FROM (SELECT rownum X FROM dual CONNECT BY LEVEL <= 3 ) xaxis INNER JOIN (SELECT rownum Y FROM dual CONNECT BY LEVEL <=3 ORDER BY 1) yaxis ON xaxis.X <> yaxis.Y OR xaxis.X = yaxis.Y 一起查询,排除JOIN中的X,Y位置:

Contents

这并不会将每对视为唯一,如果某个位置被占用,则会从所有行中排除值。例如,假设SELECT X, Y FROM (SELECT rownum X FROM dual CONNECT BY LEVEL <= 3 ) xaxis INNER JOIN (SELECT rownum Y FROM dual CONNECT BY LEVEL <=3 ORDER BY 1) yaxis ON xaxis.X <> yaxis.Y OR xaxis.X = yaxis.Y INNER JOIN ( SELECT pos_x, pos_y FROM Contents WHERE parent_id = ?) items ON items.posx <> xaxis.X AND items.posy <> yaxis.Y; 被占用,则上面返回:

(2, 2)

基本上我试图得到两组的差异。任何帮助赞赏。

2 个答案:

答案 0 :(得分:0)

我在发布问题之前就找到了答案,所以我想我会发布并同时回答它。将问题说明为得到两组的差异让我朝着正确的方向前进。

答案是MINUS运算符。将最终的minutes替换为timedelta,即可获得预期的结果:

JOIN

返回预期结果(注意缺少MINUS):

select X, Y
from 
    (select rownum X from dual  CONNECT BY LEVEL <= 3 ) xaxis
inner join 
    (select rownum Y from dual  CONNECT BY LEVEL <=3 order by 1) yaxis
on xaxis.X <> yaxis.Y OR xaxis.X = yaxis.Y

MINUS

select pos_x, pos_y FROM Contents WHERE parent_id = ?;

今天是美好的一天

答案 1 :(得分:0)

您可以使用外部联接而不是减号来执行此操作(尽管您必须对两者进行测试才能找出哪个更适合您的数据!)。

如果你一次只为一个parent_id做这件事,你会这样做:

WITH CONTENTS AS (SELECT 1 parent_id, 2 pos_x, 2 pos_y FROM dual UNION ALL
                  SELECT 2 parent_id, 2 pos_x, 1 pos_y FROM dual)
SELECT xaxis.x,
       yaxis.y
FROM   ((SELECT LEVEL x FROM dual CONNECT BY LEVEL <= 3) xaxis
        CROSS JOIN (SELECT LEVEL y FROM dual CONNECT BY LEVEL <= 3) yaxis)
       LEFT OUTER JOIN CONTENTS c ON c.pos_x = xaxis.x AND c.pos_y = yaxis.y AND c.parent_id = 1
WHERE  c.parent_id IS NULL
ORDER BY x, y;

         X          Y
---------- ----------
         1          1
         1          2
         1          3
         2          1
         2          3
         3          1
         3          2
         3          3

或者,如果您想为所有parent_ids运行它,您可以使用partitioned outer join,如下所示:

WITH CONTENTS AS (SELECT 1 parent_id, 2 pos_x, 2 pos_y FROM dual UNION ALL
                  SELECT 2 parent_id, 2 pos_x, 1 pos_y FROM dual)
SELECT c.parent_id,
       xaxis.x,
       yaxis.y
FROM   ((SELECT LEVEL x FROM dual CONNECT BY LEVEL <= 3) xaxis
        CROSS JOIN (SELECT LEVEL y FROM dual CONNECT BY LEVEL <= 3) yaxis)
       LEFT OUTER JOIN CONTENTS c PARTITION BY (c.parent_id) ON c.pos_x = xaxis.x AND c.pos_y = yaxis.y
WHERE  c.pos_x IS NULL
AND    c.pos_y IS NULL
ORDER BY c.parent_id,
         xaxis.x,
         yaxis.y;

 PARENT_ID          X          Y
---------- ---------- ----------
         1          1          1
         1          1          2
         1          1          3
         1          2          1
         1          2          3
         1          3          1
         1          3          2
         1          3          3
         2          1          1
         2          1          2
         2          1          3
         2          2          2
         2          2          3
         2          3          1
         2          3          2
         2          3          3