Sqlite 当第一个选择查询返回0时,从第二个选择查询获取结果
我有以下模式Sqlite 当第一个选择查询返回0时,从第二个选择查询获取结果,sqlite,sqliteopenhelper,Sqlite,Sqliteopenhelper,我有以下模式 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 BookImag
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);
我的目标是为给定的“Id”获取一个SELECT查询来查找(ImageId,Id),以便-
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
)
带有行号()
窗口功能:
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 |
谢谢你的帮助。但这不是我想要的东西。如果我用Id=1搜索,它应该只重新运行(11,1)。如果我用id=2查询,那么它应该只返回(20,2)。检查我编辑的答案。代替是的,这正是我要找的。但是你的陈述在这里失败了:你能看一看吗?@JohnCooper检查另一个更简单的方法。我猜你链接中的fiddle使用了不支持窗口函数的SQLite的旧版本。