PL / SQL伪序列

时间:2013-10-30 16:04:04

标签: sql oracle plsql

我有以下情况

ID    SEQ
--    ---
123   2
123   4

我希望能够做的是生成这些值的列表,并将缺少的数字填入最大数字,例如6(我从其他来源获得),其中这些数字不存在且ID为桌子。

ID    NEW_SEQ
--    ---
123     1
123     2
123     3
123     4
123     5
123     6

由于 ç

2 个答案:

答案 0 :(得分:2)

这将生成一个从1到6的数字序列,与表的所有id交叉连接,以将每个序列号与每个id相关联,然后删除已存在的组合。

SELECT t.id, s.seq
  FROM (SELECT DISTINCT id FROM myTable) t
      ,(SELECT rownum AS seq
         FROM   dual
         CONNECT BY LEVEL <= 6) s
MINUS
SELECT id, seq
  FROM myTable

ORDER BY 1, 2

答案 1 :(得分:1)

如果您有一个要在OTHER_TABLE中使用的数字列表,那么我建议您使用外部联接,如:

SELECT o.ID, o.NEW_SEQ
  FROM OTHER_TABLE o
  LEFT OUTER JOIN (SELECT ID, SEQ FROM MY_TABLE) t
    ON (o.ID = t.ID AND o.NEW_SEQ = t.SEQ)
  WHERE t.SEQ IS NULL
  ORDER BY o.ID, o.NEW_SEQ

外连接将包括第一个表中的所有行(在这种情况下为OTHER_TABLE)与第二个表中存在的行(此处为MY_TABLE)连接。如果OTHER_TABLE中有一行在MY_TABLE中没有匹配的行,则MY_TABLE中的字段将为NULL - 因此,通过检查t.SEQ是否为NULL,您可以找到OTHER_TABLE中存在的行,但是不在MY_TABLE。

SQLFiddle here

分享并享受。