【发布时间】:2015-08-18 22:27:33
【问题描述】:
例如,假设您有一个文件表和一个传输操作记录表。
CREATE TABLE files
(
id INTEGER PRIMARY KEY
-- various other columns
);
CREATE TABLE transfers
(
id INTEGER PRIMARY KEY,
file_id INTEGER,
status TEXT NOT NULL,
-- various other columns
FOREIGN KEY (file_id) REFERENCES files (id)
)
传输操作可以有多种状态——'succeeded'、'failed'、'in progress' 等。一个文件可以有许多传输操作——特别是,如果传输失败,则该文件的另一传输可能是稍后安排。
现在,假设我们要查找所有仅传输失败的文件——当前没有正在进行的传输,以后也没有成功的传输。
到目前为止,我有以下带有子选择的解决方案:
SELECT files.*
FROM files
WHERE files.id IN (
SELECT DISTINCT file_id
FROM transfers
WHERE transfers.status == 'failed'
) AND files.id NOT IN (
SELECT DISTINCT file_id
FROM transfers
WHERE transfers.status <> 'failed'
)
但是,这感觉有点笨拙和程序化。有没有更优雅的解决方案,可能涉及自联接?
【问题讨论】:
标签: sql sqlite subquery self-join