打印从A列到B列的值的Sql查询
SQL新手,正在寻求帮助 我正在尝试编写一个查询,它将打印从a列开始到B列的值,不包括第二个表的“ANS”列中的值 这是两张桌子,X和Y打印从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
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