当前位置: 代码迷 >> Oracle开发 >> 请问一个复杂的SQL语句
  详细解决方案

请问一个复杂的SQL语句

热度:93   发布时间:2016-04-24 06:42:34.0
请教一个复杂的SQL语句
表结构如下
KEY1 VARHCAR2(6)
KEY2 VARCHAR2(6)

数据上KEY2的值全部是补0满6位的数值,但是存在不连续的,例如
003001
003003
003004
004011
004013

现在要通过SQL实现用户输入003我就要找到最小的空号“003002”,用户输入00401我就要找到“004012”
已经纠结2天,请问有什么好方法。谢谢


------解决方案--------------------
引用:
表结构如下
KEY1 VARHCAR2(6)
KEY2 VARCHAR2(6)

数据上KEY2的值全部是补0满6位的数值,但是存在不连续的,例如
003001
003003
003004
004011
004013

现在要通过SQL实现用户输入003我就要找到最小的空号“003002”,用户输入00401我就要找到“004012”
已经纠结2天,请问有什么好方法。谢谢


WITH T AS
 (SELECT '003001' C1
    FROM DUAL
  UNION ALL
  SELECT '003003' C1
    FROM DUAL
  UNION ALL
  SELECT '003004' C1
    FROM DUAL
  UNION ALL
  SELECT '004011' C1
    FROM DUAL
  UNION
  SELECT '005011' C1
    FROM DUAL
  UNION ALL
  SELECT '004013' C1
    FROM DUAL)
SELECT LPAD(MIN(T1.C1) + 1, 6, 0)
  FROM (SELECT C1,
               LEAD(TO_NUMBER(C1)) OVER(ORDER BY TO_NUMBER(C1)) - TO_NUMBER(C1) GAP
          FROM T
         WHERE SUBSTR(T.C1, 1, 3) = SUBSTR('00401', 1, 3)) T1
 WHERE T1.GAP > 1
    OR T1.GAP IS NULL;

------解决方案--------------------
引用:
表结构如下
KEY1 VARHCAR2(6)
KEY2 VARCHAR2(6)

数据上KEY2的值全部是补0满6位的数值,但是存在不连续的,例如
003001
003003
003004
004011
004013

现在要通过SQL实现用户输入003我就要找到最小的空号“003002”,用户输入00401我就要找到“004012”
已经纠结2天,请问有什么好方法。谢谢


WITH T AS
 (SELECT '003001' C1
    FROM DUAL
  UNION ALL
  SELECT '003003' C1
    FROM DUAL
  UNION ALL
  SELECT '003007' C1
    FROM DUAL
  UNION ALL
  SELECT '004011' C1
    FROM DUAL
  UNION
  SELECT '005001' C1
    FROM DUAL
  UNION ALL
  SELECT '004013' C1
    FROM DUAL
  UNION
  SELECT '020002' C1
    FROM DUAL
  UNION ALL
  SELECT '020003' C1
    FROM DUAL)
SELECT LPAD(DECODE(T2.GAP,
                   NULL,
                   (SELECT DECODE(SUBSTR(MIN(T3.C1), -3),
                                  '001',
                                  MIN(T3.C1) + 1,
                                  MIN(T3.C1) - 1)
                      FROM T T3
                     WHERE SUBSTR(T3.C1, 1, 3) = SUBSTR('020', 1, 3)),
                   T2.C1 + 1),
            6,
            0)
  FROM (SELECT T1.C1, T1.GAP
          FROM (SELECT C1,
                       LEAD(TO_NUMBER(C1)) OVER(ORDER BY TO_NUMBER(C1)) - TO_NUMBER(C1) GAP
                  FROM T
                 WHERE SUBSTR(T.C1, 1, 3) = SUBSTR('020', 1, 3)) T1
         WHERE T1.GAP > 1
            OR T1.GAP IS NULL
  相关解决方案