我在Android应用程序中有一个带有对话和参与者表的SQLite3数据库。我想要一个查询,给定参与者列表,只返回其参与者列表与给定参与者列表完全匹配的那些会话。例如,给定这些表:
CONVERSATIONS CONVERSATION_PARTICIPANTS
------------- -------------------------
id conversation_id name
-- --------------- ----
1 1 u1
2 1 u2
3 2 u1
4 3 u1
我希望以下输出([参与者输入] => [会话输出]):
我已经看到了涉及连接参与者名称的有序列表的解决方案,但是如果可能的话,我宁愿不去那条路线。这样的事情可能吗?没有临时表?
答案 0 :(得分:1)
要检查两个集合是否不相等,根据单个项目,您必须检查任一集合中是否存在另一个集合中不存在的任何项目。
假设我们有一个表Input(name)
,它可以像这样实现:
SELECT id
FROM Conversations
WHERE NOT EXISTS (SELECT 1
FROM Conversation_Participants
WHERE conversation_id = Conversations.id
AND NOT EXISTS (SELECT 1
FROM Input
WHERE name = Conversation_Participants.name))
AND NOT EXISTS (SELECT 1
FROM Input
WHERE NOT EXISTS (SELECT 1
FROM Conversation_Participants
WHERE conversation_id = Conversations.id
AND name = Input.name))
如果您不想为Input
使用(临时)表,可以将其替换为动态返回值的子查询:
... FROM Input ...
... FROM (SELECT 'u1' AS Name UNION ALL SELECT 'u2') AS Input ...