Получить результат из второго запроса выбора, когда первый запрос выбора возвращает 0 - PullRequest
1 голос
/ 07 мая 2020

У меня следующая схема

CREATE TABLE BookImage (Id UNSIGNED BIG INT, ImageId UNSIGNED BIG INT, IsDefault INT, 
                           PRIMARY KEY(Id, ImageId));

INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,10,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,11,1);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (1,12,0);

INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,20,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,21,0);
INSERT OR IGNORE INTO BookImage(Id,ImageId,IsDefault) VALUES (2,22,0);

Моя цель - получить запрос SELECT для поиска (ImageId, Id) для данного «Id», например:

  1. , если IsDefault = 1, затем вернуть строку
  2. , если IsDefault = 0, затем вернуть строку с наименьшим ImageId

Для данной таблицы, если я запрашиваю с Id = 1, он должен возвращать только (11,1) если я запрашиваю с Id = 2, он должен возвращать только (20,2), потому что для Id = 2 нет IsDefault = 1.

Мне нужен запрос выбора sqlite для этого. Я попробовал запрос из этого сообщения , но он не работает

SELECT * 
FROM BookImage 
WHERE Id=1 AND IsDefault=1
UNION ALL
SELECT * 
FROM BookImage 
WHERE Id=1 ORDER BY ImageId ASC LIMIT 1 AND NOT EXISTS (
    SELECT *
    FROM BookImage 
    WHERE Id=1 AND IsDefault=1 LIMIT 1 
)

http://sqlfiddle.com/#! 5 / e094e / 1/0

1 Ответ

1 голос
/ 07 мая 2020

С функцией окна ROW_NUMBER():

SELECT Id, ImageId
FROM (
  SELECT *,
    ROW_NUMBER() OVER (PARTITION BY Id ORDER BY IsDefault DESC, ImageId) rn
  FROM BookImage
) b
WHERE rn = 1 AND Id = ?

Замените ? на Id, которое вы ищете. См. Демонстрацию .

Другой способ:

SELECT Id, ImageId
FROM BookImage
WHERE Id = ?
ORDER BY ROW_NUMBER() OVER (ORDER BY IsDefault DESC, ImageId)
LIMIT 1

См. демонстрацию .

Для более старых версий SQLite, которые не поддерживают оконные функции:

SELECT Id, ImageId 
FROM BookImage
WHERE Id = ?
ORDER BY IsDefault DESC, ImageId
LIMIT 1;

См. демонстрацию . Результаты для Id = 1:

| Id  | ImageId |
| --- | ------- |
| 1   | 11      |

Результаты для Id = 2:

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