我有以下模式
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查询,为给定的 "Id "找到(ImageId, Id),这样--。
对于给定的表,如果我用Id=1查询,应该只返回(11,1),如果我用Id=2查询,应该只返回(20,2),因为Id=2没有IsDefault=1。
我需要一个sqlite select查询来实现这个目标。我已经尝试了这个查询 职位 但这是行不通的
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
)
含有 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 |