Majestio Asked:2020-12-31 19:55:26 +0000 UTC2020-12-31 19:55:26 +0000 UTC 2020-12-31 19:55:26 +0000 UTC 选择斐波那契数列 772 问题不实际。我想评估在不同方言(PostgreSQL、、SQLite3)的 SQL 中可以使用哪些方法来解决它MySQL。以及解决起来有多么困难。 一个任务 有一个正数表[0..N]。您需要按升序显示指定表格中包含在斐波那契数列中的所有数字。 mysql 2 个回答 Voted Best Answer Mike 2020-12-31T20:22:48Z2020-12-31T20:22:48Z SQLite、postgresql 的无表生成器: WITH Recursive Q(Num,Prev) as( select 1,1 union all select Q.Num+Q.Prev,Q.Num from Q where Q.Num<10000 ) select Num from Q 如果您只需要从中选择某个表中的那些数字,则将与该表的连接添加到最终选择以检查其中是否存在数字。 对于 MS SQL 和 Oracle,从查询中删除上面的短语Recursive。对于 Oracle,from DUAL在select 1,1. MySQL 需要一个包含所需记录数的引用表,这些记录的内容无关紧要: select @tmp:=@Prev+@Num as Num, @Prev:=@Num, @Num:=@tmp from seqnum, (select @Prev:=1, @Num:=1) A order by Num 同样,这是一个生成器。要检查某个表中是否存在 - 包含在子查询中并进行连接。 Majestio 2020-12-31T20:14:08Z2020-12-31T20:14:08Z 我自己回答 :) 到目前为止PostgreSQL: 分几个阶段解决: 1)求表中的最大值 2)CROSS JOIN整个表与从存储过程中选择的结果进行匹配 CREATE OR REPLACE FUNCTION fib(f INTEGER) RETURNS SETOF INTEGER LANGUAGE SQL AS $$ WITH RECURSIVE t(a,b) AS ( VALUES(0,1) UNION ALL SELECT greatest(a,b), a + b AS a FROM t WHERE b < $1 ) SELECT a FROM t; $$; 其中参数将是表中的最大值 对于 SQLite3 和 MySQL,我们正在等待 -c ... )虽然,老实说,对于没有存储过程的 PostgreSQL 也是可能的。
SQLite、postgresql 的无表生成器:
如果您只需要从中选择某个表中的那些数字,则将与该表的连接添加到最终选择以检查其中是否存在数字。
对于 MS SQL 和 Oracle,从查询中删除上面的短语
Recursive
。对于 Oracle,from DUAL
在select 1,1
.MySQL 需要一个包含所需记录数的引用表,这些记录的内容无关紧要:
同样,这是一个生成器。要检查某个表中是否存在 - 包含在子查询中并进行连接。
我自己回答 :) 到目前为止
PostgreSQL
:分几个阶段解决:
1)求表中的最大值
2)
CROSS JOIN
整个表与从存储过程中选择的结果进行匹配其中参数将是表中的最大值
对于 SQLite3 和 MySQL,我们正在等待 -c ... )虽然,老实说,对于没有存储过程的 PostgreSQL 也是可能的。