Нет такого столбца в коррелированном подзапросе - PullRequest
0 голосов
/ 11 июня 2019

Итак, я написал запрос почти так же, как тот, который описан в этом ответе . Однако я получаю сообщение об ошибке: «Нет такого столбца b.when.

»

Мое выбранное утверждение:

SELECT
    mileage,
    (SELECT b.mileage FROM MileageEvents as b WHERE `b.when` < `a.when` ORDER BY `b.when` DESC LIMIT 1) as last_mileage,
    gallons,
    cost_per_gallon,
    `when`
FROM MileageEvents as a

Я знаю, что уже писал такие запросы, но не могу понять, что происходит с этим запросом. Что я делаю не так?

Дамп моей базы данных:

PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "MileageEvents" (
    "mileage"   INTEGER,
    "when"  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    "cost_per_gallon"   INTEGER,
    "gallons"   INTEGER,
    "id"    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    "car_id"    INTEGER NOT NULL
);
INSERT INTO MileageEvents VALUES(150000,'2019-03-12',3.3500000000000000888,12,1,1);
INSERT INTO MileageEvents VALUES(150300,'2019-03-19',3.25,12,2,1);
INSERT INTO MileageEvents VALUES(150693,'2019-03-22',3.4500000000000001776,12,3,1);
INSERT INTO MileageEvents VALUES(151000,'2019-03-25',3.3900000000000001243,12,4,1);
INSERT INTO MileageEvents VALUES(151600,'2019-04-01',2.25,12,5,1);
INSERT INTO MileageEvents VALUES(151883,'2019-06-10 23:01:43',2.4500000000000001776,11.695999999999999729,6,1);
DELETE FROM sqlite_sequence;
INSERT INTO sqlite_sequence VALUES('MileageEvents',6);
COMMIT;

1 Ответ

2 голосов
/ 11 июня 2019

(Во-первых, я бы использовал обычные двойные кавычки вместо обратных черт в стиле MySQL или, что еще лучше, идентификатор, который не является зарезервированным ключевым словом)

Вам нужно использовать b."when". То, что вы делаете, обрабатывает всю строку b.when как идентификатор, без разделения на имя таблицы и имя столбца.

Переписано:

SELECT
    mileage,
    (SELECT b.mileage FROM MileageEvents as b WHERE b."when" < a."when" ORDER BY b."when" DESC LIMIT 1) as last_mileage,
    gallons,
    cost_per_gallon,
    "when"
FROM MileageEvents as a;

Примечание: при использовании sqlite 3.25 или новее вы можете полностью избежать подзапроса:

SELECT
    mileage,
    lag(mileage) OVER (ORDER BY "when") AS last_mileage,
    gallons,
    cost_per_gallon,
    "when"
FROM MileageEvents;
...