Select 来自主 table 的所有记录,但有条件地只有一条来自细节 table
Select all records from master table, but conditionally only one from detail table
如何select master table GROUPS 中的所有记录,但只有详细 table SESSIONS 中的适当记录?
较早的帖子使我相信为此需要一个 LEFT JOIN 子查询。
下面的查询似乎有效,但仅适用于第一条记录。
后续记录 return session_start 等的 NULL 值
如何获取所有组记录的会话数据?
SELECT g.group_id, g.group_name
FROM groups g
LEFT JOIN (
SELECT session_id,
group_id,
session_start,
session_stop
FROM sessions
WHERE :current_time < session_stop
ORDER BY :current_time BETWEEN session_start AND session_stop DESC,
session_stop
LIMIT 1 ) s
ON s.group_id = g.group_id
有条件地 return 从“会话”获取单个记录的规则是:
Return current_time 位于 session_start 和 session_stop 之间的会话记录。
否则,如果 none 存在,return 第一个会话记录 current_time 小于 session_start。
current_time 大于 session_stop 的会话不得 returned。
两个 table,“组”和“会话”:
CREATE TABLE groups (
group_id INTEGER PRIMARY KEY AUTOINCREMENT,
group_name VARCHAR UNIQUE ON CONFLICT IGNORE
);
CREATE TABLE sessions (
session_id INTEGER PRIMARY KEY AUTOINCREMENT,
group_id INTEGER REFERENCES groups (group_id) ON DELETE CASCADE,
session_start REAL,
session_stop REAL
);
组table内容:
group_id group_name
1 Group 1
2 Group 2
场次table内容:
session_id group_id session_start session_stop
1 1 2459603.875 2459604.2291666665
2 1 2459604.875 2459605.2291666665
3 1 2459605.875 2459606.2291666665
261 2 2459603.875 2459604.2291666665
262 2 2459604.875 2459605.2291666665
263 2 2459605.875 2459606.2291666665
您可以使用 ROW_NUMBER()
window 函数从 sessions
中为每个 group_id
选择 1 行:
SELECT g.*, s.*
FROM groups g
LEFT JOIN (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY group_id
ORDER BY julianday('now','localtime') BETWEEN session_start AND session_stop DESC,
session_start
) rn
FROM sessions
WHERE julianday('now','localtime') <= session_stop
) s ON s.group_id = g.group_id AND s.rn = 1;
如何select master table GROUPS 中的所有记录,但只有详细 table SESSIONS 中的适当记录?
较早的帖子使我相信为此需要一个 LEFT JOIN 子查询。 下面的查询似乎有效,但仅适用于第一条记录。 后续记录 return session_start 等的 NULL 值
如何获取所有组记录的会话数据?
SELECT g.group_id, g.group_name
FROM groups g
LEFT JOIN (
SELECT session_id,
group_id,
session_start,
session_stop
FROM sessions
WHERE :current_time < session_stop
ORDER BY :current_time BETWEEN session_start AND session_stop DESC,
session_stop
LIMIT 1 ) s
ON s.group_id = g.group_id
有条件地 return 从“会话”获取单个记录的规则是:
Return current_time 位于 session_start 和 session_stop 之间的会话记录。
否则,如果 none 存在,return 第一个会话记录 current_time 小于 session_start。
current_time 大于 session_stop 的会话不得 returned。
两个 table,“组”和“会话”:
CREATE TABLE groups (
group_id INTEGER PRIMARY KEY AUTOINCREMENT,
group_name VARCHAR UNIQUE ON CONFLICT IGNORE
);
CREATE TABLE sessions (
session_id INTEGER PRIMARY KEY AUTOINCREMENT,
group_id INTEGER REFERENCES groups (group_id) ON DELETE CASCADE,
session_start REAL,
session_stop REAL
);
组table内容:
group_id group_name
1 Group 1
2 Group 2
场次table内容:
session_id group_id session_start session_stop
1 1 2459603.875 2459604.2291666665
2 1 2459604.875 2459605.2291666665
3 1 2459605.875 2459606.2291666665
261 2 2459603.875 2459604.2291666665
262 2 2459604.875 2459605.2291666665
263 2 2459605.875 2459606.2291666665
您可以使用 ROW_NUMBER()
window 函数从 sessions
中为每个 group_id
选择 1 行:
SELECT g.*, s.*
FROM groups g
LEFT JOIN (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY group_id
ORDER BY julianday('now','localtime') BETWEEN session_start AND session_stop DESC,
session_start
) rn
FROM sessions
WHERE julianday('now','localtime') <= session_stop
) s ON s.group_id = g.group_id AND s.rn = 1;