Sql 视图中的子查询中的访问值
例如,我设置了一个简单的SQLite模式,如下所示:Sql 视图中的子查询中的访问值,sql,sqlite,Sql,Sqlite,例如,我设置了一个简单的SQLite模式,如下所示: sqlite> CREATE TABLE foo (a TEXT, b INT, PRIMARY KEY(a, b)); sqlite> INSERT INTO foo (a, b) VALUES ('x', 5); sqlite> INSERT INTO foo (a, b) VALUES ('x', 10); sqlite> INSERT INTO foo (a, b) VALUES ('x', 15); sqli
sqlite> CREATE TABLE foo (a TEXT, b INT, PRIMARY KEY(a, b));
sqlite> INSERT INTO foo (a, b) VALUES ('x', 5);
sqlite> INSERT INTO foo (a, b) VALUES ('x', 10);
sqlite> INSERT INTO foo (a, b) VALUES ('x', 15);
sqlite> INSERT INTO foo (a, b) VALUES ('y', 5);
sqlite> INSERT INTO foo (a, b) VALUES ('y', 12);
sqlite> INSERT INTO foo (a, b) VALUES ('y', 16);
CREATE VIEW prev
AS
SELECT
a,
b AS current_b,
(SELECT MAX(b) FROM foo WHERE b < current_b) AS previous_b
FROM foo;
b表示时间戳,a标识对象。当然,真正的应用程序包含更多的列
我想创建一个视图,其中包含a,b到下一个较小值b的映射,其中foo中存在一个条目。对于上面的示例,它应该是这样的:
a | b | previous_b
---------------------
x | 10 | 5
x | 15 | 10
y | 12 | 5
y | 16 | 12
我尝试创建如下视图:
sqlite> CREATE TABLE foo (a TEXT, b INT, PRIMARY KEY(a, b));
sqlite> INSERT INTO foo (a, b) VALUES ('x', 5);
sqlite> INSERT INTO foo (a, b) VALUES ('x', 10);
sqlite> INSERT INTO foo (a, b) VALUES ('x', 15);
sqlite> INSERT INTO foo (a, b) VALUES ('y', 5);
sqlite> INSERT INTO foo (a, b) VALUES ('y', 12);
sqlite> INSERT INTO foo (a, b) VALUES ('y', 16);
CREATE VIEW prev
AS
SELECT
a,
b AS current_b,
(SELECT MAX(b) FROM foo WHERE b < current_b) AS previous_b
FROM foo;
我怎样才能解决这个问题?如果这是不可能的,还有其他选择吗?您不能使用这样的别名。使用
CREATE VIEW prev
AS
SELECT
f1.a,
f1.b AS current_b,
(SELECT MAX(f2.b) FROM foo f2 WHERE f2.b < f1.b) AS previous_b
FROM foo as f1;
您希望使用相关子查询。因此,您需要表别名和限定列名:
CREATE VIEW prev AS
SELECT f.a, f.b AS current_b,
(SELECT MAX(f2.b) FROM foo f2 WHERE f2.a = b.a AND f2.b < f.b
) AS previous_b
FROM foo f;
您应该始终使用表别名和限定列名,尤其是在学习SQL时。学习这门语言时要养成正确的习惯。谢谢你,我刚加了一个和f1.a=f2.a,它就成功了!一旦允许,我们将尽快接受。谢谢,我已经有一段时间没有使用SQL了。我添加了和f1.a=f2.a,结果成功了!