2014-01-27 118 views
0

嗨即时通讯新的SQL查询我只知道简单的查询。 我的问题是有可能SELECT skipped check number EX2001,EX2002,EX2004 select result will show EX2003。 在此先感谢,对不起我的英语。 你只能回答算法,生病尝试把它实现到SQL。 例如: SELECT * FROM SETTLEMENT WHERE checkno不在(在ex2001和ex2900之间) 是否可以这样?即时通讯使用MS SQL 2008.SQL查询知道跳过的数字

+0

你可以在这里找到答案:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html – fancyPants

+0

哪些DBMS是你使用? Postgres的?甲骨文? –

回答

0
create table sequence(st varchar(50)) 

insert into sequence values('EX2001'); 
insert into sequence values('EX2002'); 
insert into sequence values('EX2004'); 
insert into sequence values('EX2005'); 
insert into sequence values('EX2008'); 

假设你原来的表名是序列只有一个字段,您可以修改,按您的需求

尝试以下

DECLARE @all TABLE 
(
st varchar(20) 

) 
declare @start int 
declare @end int 
declare @str varchar(20) 
set @start=2000 //define starting point 
set @end=2010 //define end point 
while(@start<@end) 
    BEGIN 
     SET @[email protected]+1 
     set @str='EX'+cast(@start as varchar(20)) 
     INSERT INTO @all VALUES (''[email protected]+'') 
    END 

SELECT * from @all 
except 
select * from sequence 

输出

st 
EX2003 
EX2006 
EX2007 
EX2009 
EX2010 
+0

ty回复,将尝试 – Trutone

+0

它工作ty先生。 timus2001 – Trutone

+0

欢迎你,你介意加注:) – sumit

0

如果你需要在查询中硬编码的值,那么它可以像(因为你没有发布任何代码,所以这里是一个简单的查询)完成。你可以在SQL中使用IN()NOT IN()

select * from table where check_number not in ('EX2001','EX2002','EX2004'); 
+0

ty用于快速回复,但我的数据库很大。是否有可能使用范围不在? – Trutone

+0

是的,但它是从问题不清楚,请张贴一些代码,你想如何使用它。 –

+0

我更新我的问题,你能帮助解决吗? – Trutone

0

由于没有提到的SQL引擎,这个答案只对甲骨文11G

选择1:分层查询

See Fiddle here

CREATE TABLE TEST1 (A VARCHAR2 (9)); 

INSERT INTO 
     TEST1 
VALUES 
     ('EX2001'); 

INSERT INTO 
     TEST1 
VALUES 
     ('EX2002'); 

INSERT INTO 
     TEST1 
VALUES 
     ('EX2004'); 

COMMIT; 

WITH TEST2 
    AS (SELECT 
      TO_NUMBER(SUBSTR (A, 
        3)) 
       AS A 
     FROM 
      TEST1) 
SELECT 
     MIN_A 
     - 1 
     + LEVEL 
FROM 
     (SELECT 
      MIN (A) MIN_A, 
      MAX (A) MAX_A 
     FROM 
      TEST2) 
CONNECT BY 
     LEVEL <= MAX_A 
      - MIN_A 
      + 1 
MINUS 
SELECT A FROM TEST2; 

选项2:利用Oracle分析功能

See Fiddle here

WITH T 
    AS (SELECT 
      TO_NUMBER(SUBSTR (A, 
        3)) 
       AS SNO, 
       SYSDATE AS SDATE 
     FROM 
      TEST1) 
SELECT 
     SDATE, 
     SNO 
     + 1 
      FIRST_MISSING, 
     DECODE (NEXT_SNO 
      - 1, 
      SNO 
      + 1, TO_NUMBER (NULL), 
      NEXT_SNO 
      - 1) 
      LAST_MISSING 
FROM 
     (SELECT 
      SDATE, 
      SNO, 
      LAG (SNO) 
       OVER (PARTITION BY SDATE 
         ORDER BY SNO) 
       LAST_SNO, 
      LEAD (SNO) 
       OVER (PARTITION BY SDATE 
         ORDER BY SNO) 
       NEXT_SNO 
     FROM 
      T) 
WHERE 
     NVL (NEXT_SNO, 
      SNO 
      + 1) <> SNO 
        + 1; 
+0

ty for reply,会用hierarchi进程 – Trutone