SQL查询打印从A列开始到B列的值

标签 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
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 之间的所有数字后,在生成的表上进行左连接,并使用 not contains 仅获取 table2 中不存在的数字。

--Get the maximum value of `to` column and generate all numbers between 0 and that value
WITH maxto(maxt) as (SELECT MAX(TO) FROM TABLE1)
,y(n) AS 
(SELECT 0 AS n FROM dual
 UNION ALL
 SELECT n + 1 AS n FROM y WHERE n < (SELECT maxt FROM maxto)) 
SELECT * FROM
(SELECT t1.a, y.n
 FROM y
 LEFT JOIN table1 t1 on y.n between t1.from and t1.to 
 WHERE t1.a IS NOT NULL) x
WHERE NOT EXISTS (SELECT 1 FROM table2 WHERE x.a = a and x.n = ans)
ORDER BY 1,2

Sample demo

关于SQL查询打印从A列开始到B列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40178903/

相关文章:

sql - 索引 View 实际上索引什么

sql - 如何使用 TO_DATE 函数处理空值?

sql - Oracle 中 Number 列的默认 Scale 值

sql - Oracle MINUS 两种方式(获得选择之间的差异)

mysql - 使用 AND(或)根据多行值进行选择

java - 如何从存储过程返回多行?

sql - 在 Oracle 中使用 LISTAGG 函数

sql - Oracle RAC 和序列

SQL Server - 按行号分组 - 间隙和孤岛

mysql - 如何从列中删除多个关键字