如何 select 来自一个 table 的所有数据和来自另一个 table 的记录匹配第一个 selection 中的数据。全部在一个查询中

How to select all data from one table and records from another table matching data in first selection. All in one query

我有两个 table MessagesFilesFiles table 通过其 message_id 外键引用 Messages,外键也对应于 Messages 的名为 message_id 的主键。消息实体可能有也可能没有文件,但没有消息就不可能有文件。

所以我想 select 一次查询中的所有内容。所有消息,如果消息有一个文件,那么 select 也是一个文件。据我了解,生成的查询应如下所示:

select * from Messages union select * from Files where message_id = Messages.message_id

很遗憾,这个简单的查询无效。我也试过使用连接:

select * from Messages 
left outer join Files on Messages.message_id = Files.message_id 
union 
select * from Files 
left outer join Messages on Messages.message_id = Files.message_id

但它只给我那些有文件的消息。使用子查询似乎不是解决方案。那么我该怎么做呢?

你想要一个全外连接,SQLite 不直接支持。您可以按照您已经尝试过的方式,用联合来模拟它:

SELECT m.*, f.*
FROM Messages m
LEFT JOIN Files f ON m.message_id = f.message_id
UNION ALL
SELECT m.*, f.*
FROM Files f
LEFT JOIN Messages m ON m.message_id = f.message_id
WHERE m.message_id IS NULL;

您的需求重点是:

A message entity may or may not have a file but there cannot be a file without a message

这是 LEFT 连接 MessagesFiles 的定义:

SELECT * 
FROM Messages m LEFT JOIN Files f
ON f.message_id = m.message_id;

如果您想要来自一个 table 的数据,如果它存在,则需要来自另一个 table 的数据,那么为什么简单的左外连接不起作用?

select * from Messages 
left outer join Files on 
Messages.message_id = Files.message_id