Как узнать, что текущая строка является последней в SQlite? - PullRequest
0 голосов
/ 09 декабря 2018

Я использую Sqlite 3.

Мне нужно знать, является ли текущая строка последней в результате запроса SQL, прежде чем вызывать sqlite3_step ().

После проверки существующихpost

SQLite3 - как узнать, является ли текущая строка последней строкой

и

Как проверить, является ли текущая строкапоследняя выбранная строка в запросе sql?

Поскольку каждая строка в SQlite3 имеет ROWID, я придумаю способ написания кода следующим образом:

SELECT (ROWID = MAX(ROWID)) AS IsLast FROM MyTable ORDER BY ROWID;

данные в MyTable:

|BID|
|3|
|2|
|5|
|7|

Ожидаемый результат - все строки, кроме последней - FALSE, как показано ниже:

    |0|
    |0|
    |0|
    |1|

Но фактический результат:

|1|

Более того, я пытаюсь интегрировать код в более сложный запрос, который получается из SQL выбирает только строки с максимальным значением в столбце , как показано ниже:

SELECT a.id, a.rev, a.contents, b.mycount, (a.ROWID = MAX(a.ROWID)) AS IsLast
FROM YourTable a
INNER JOIN (
    SELECT id, MAX(rev) rev, COUNT(id) mycount
    FROM YourTable
    GROUP BY id
) b ON a.id = b.id AND a.rev = b.rev ORDER BY a.ROWID;

Takeисходная таблица в исходном сообщении в качестве примера:

        +------+-------+--------------------------------------+
        | id   | rev   | content                              |
        +------+-------+--------------------------------------+
        | 1    | 1     | ...                                  |
        | 2    | 1     | ...                                  |
        | 1    | 2     | ...                                  |
        | 1    | 3     | ...                                  |
        +------+-------+--------------------------------------+

После использования запроса ожидаемый результат должен быть (столбец ast - это флаг IsLast):

    |2|1|...|1|0|
    |1|3|...|3|1|

Но фактический результат - только одна строка:

|1|3|...|3|1|

В чем проблема?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

В документации сказано, что sqlite3_step () возвращает разные значения в зависимости от состояния запроса

https://www.sqlite.org/c3ref/step.html

На первый взгляд кажется, что вы должны вызывать его, пока не вернется SQLITE_DONE.Затем вам нужно будет сбросить его, прежде чем он будет вызван снова для этого оператора

0 голосов
/ 09 декабря 2018

Ошибка, вызванная тем, что ваш подзапрос не содержал столбец ROWID, но вы используете этот столбец в основном запросе.

Вы можете попробовать использовать подзапрос, чтобы получить MAX(ROWID), а затем использовать CASE WHEN установить последний флаг.

Ваш первый запрос

Схема (SQLite v3.18)

CREATE TABLE YourTable(
  BID int
);

INSERT INTO YourTable VALUES (3);
INSERT INTO YourTable VALUES (2);
INSERT INTO YourTable VALUES (5);
INSERT INTO YourTable VALUES (7);

Запрос # 1

SELECT  
     BID,(CASE WHEN (SELECT MAX(ROWID) FROM YourTable) = a.ROWID then 1 else 0 end) AS IsLast
FROM YourTable a;

| BID | IsLast |
| --- | ------ |
| 3   | 0      |
| 2   | 0      |
| 5   | 0      |
| 7   | 1      |

Просмотр на скрипте БД

Схема (SQLite v3.18)

CREATE TABLE YourTable(
  Id int,
  rev int,
  contents varchar(50)
);

INSERT INTO YourTable VALUES (1,1,'test1');
INSERT INTO YourTable VALUES (2,1,'test2');
INSERT INTO YourTable VALUES (1,2,'test1');
INSERT INTO YourTable VALUES (1,3,'test2');

Запрос № 1

SELECT a.*,
       (CASE WHEN maxROWID = a.ROWID then 1 else 0 end) AS IsLast
FROM YourTable a
 JOIN 
(
  SELECT Id,
         MAX(rev) rev, 
         COUNT(id) mycount,
         (SELECT MAX(ROWID) FROM YourTable) maxROWID
  FROM YourTable
  group by Id
) b  ON a.id = b.id AND a.rev = b.rev
ORDER BY a.ROWID;

| Id  | rev | contents | IsLast |
| --- | --- | -------- | ------ |
| 2   | 1   | test2    | 0      |
| 1   | 3   | test2    | 1      |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...