Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 视图中的子查询中的访问值_Sql_Sqlite - Fatal编程技术网

Sql 视图中的子查询中的访问值

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模式,如下所示:

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,结果成功了!