打印从A列到B列的值的Sql查询

打印从A列到B列的值的Sql查询,sql,oracle,Sql,Oracle,SQL新手,正在寻求帮助 我正在尝试编写一个查询,它将打印从a列开始到B列的值,不包括第二个表的“ANS”列中的值 这是两张桌子,X和Y Table1 A FROM TO a 6 9 b 3 6 c 0 3 d 2 3 Table2 A ANS a 7 b 5 c 1 我希望输出为 A ANS a 6 a 8 a 9 b 3 b 4 b 6 c 0

SQL新手,正在寻求帮助

我正在尝试编写一个查询,它将打印从a列开始到B列的值,不包括第二个表的“ANS”列中的值

这是两张桌子,X和Y

    Table1  
A   FROM  TO
a   6     9
b   3     6
c   0     3
d   2     3

    Table2  
A   ANS 
a   7   
b   5   
c   1   
我希望输出为

A   ANS
a   6
a   8
a   9
b   3
b   4
b   6
c   0
c   2
c   3
d   2
d   3
我试过写这样的东西,但没用

WITH y(n) AS 
(SELECT 1 AS n
FROM dual
UNION ALL
SELECT n + 1 AS n
FROM y, table1 T
WHERE n <= T.TO AND n>= T.FROM )
SELECT * FROM y;
打印5000多行,这就是我不附加输出的原因
提前感谢

使用递归cte获取from和to之间的所有数字后,在生成的表上留下join,并使用not exists仅获取表2中不存在的数字


您可以使用分层查询和减号操作,并完全避免联接。如果你对集合论有点熟悉,负号很容易理解。使用分层查询生成数字有点不自然,可能仅在Oracle中可用,我不知道其他任何db产品,但它使用非常频繁,工作速度非常快

我将列名改为from\n和to\n;我不记得from和/或to是否是Oracle中的保留字,但为什么要冒险呢

with
     table1 ( a, from_n, to_n ) as (
       select 'a', 6, 9 from dual union all
       select 'b', 3, 6 from dual union all
       select 'c', 0, 3 from dual union all
       select 'd', 2, 3 from dual
     ),
    table2 ( a, ans ) as (  
       select 'a', 7 from dual union all
       select 'b', 5 from dual union all
       select 'c', 1 from dual
     )
-- everything above this point is for testing only and can be removed
-- solution (SQL query) begins below
select a, from_n + level - 1 as ans
  from table1
  connect by level <= 1 + to_n - from_n
      and prior a = a
      and prior sys_guid() is not null
minus
select a, ans 
  from table2
;

您使用的是MySQL还是Oracle?删除了MySQL标签,因为您使用的是CTEs。我使用的是Oracle。我添加了MySQL标签,因为我认为他们可能会插入一些信息。谢谢您的帮助。我尝试了您的查询,结果几乎正确,只是直到“to”列的上限才打印出来,它显示直到1小于值..类似于[FROM,TOHi,我同意减号更容易理解,但如果行数超过我认为的使用难度??我不明白,你这是什么意思?这个答案有我的投票权;它只需要遍历表1一次。我认为OP的困惑在于用于生成表1和表1数据的子查询-它们很明显ly不需要创建那些子查询,因为它们可以直接查询表!@Boneist-这是可能的,这就是为什么我开始在大多数情况下在代码中添加注释的原因,但在这种情况下,OP证明了她/他熟悉分解子查询。不过,我会将其添加到代码中,因为这可能有助于其他人重新进行查询aders.抱歉@mathguy我的坏忽略了这个评论
WITH y(n) AS 
(SELECT level - 1 FROM dual connect by level <= select max(TO- FROM) +2 from table1)
SELECT t1.a, t1.from + y.n FROM table1 t1
         JOIN y on 1 = 1 
         left JOIN table2 on y.n + t1.FROM = t2.ANS and t2.a = t1.a
where y.n < t1.TO-t1.FROM  
  and t2.ANS is null;
with
     table1 ( a, from_n, to_n ) as (
       select 'a', 6, 9 from dual union all
       select 'b', 3, 6 from dual union all
       select 'c', 0, 3 from dual union all
       select 'd', 2, 3 from dual
     ),
    table2 ( a, ans ) as (  
       select 'a', 7 from dual union all
       select 'b', 5 from dual union all
       select 'c', 1 from dual
     )
-- everything above this point is for testing only and can be removed
-- solution (SQL query) begins below
select a, from_n + level - 1 as ans
  from table1
  connect by level <= 1 + to_n - from_n
      and prior a = a
      and prior sys_guid() is not null
minus
select a, ans 
  from table2
;
A        ANS
- ----------
a          6
a          8
a          9
b          3
b          4
b          6
c          0
c          2
c          3
d          2
d          3

 11 rows selected