Android SQL从与一组行完全匹配的多对多关系中进行选择
我在Android应用程序中有一个SQLite3数据库,其中包含对话和参与者表。我想要一个查询,在给定参与者列表的情况下,只返回那些参与者列表与给定参与者列表完全匹配的对话。例如,给定以下表格:Android SQL从与一组行完全匹配的多对多关系中进行选择,android,sql,sqlite,Android,Sql,Sqlite,我在Android应用程序中有一个SQLite3数据库,其中包含对话和参与者表。我想要一个查询,在给定参与者列表的情况下,只返回那些参与者列表与给定参与者列表完全匹配的对话。例如,给定以下表格: CONVERSATIONS CONVERSATION_PARTICIPANTS ------------- ------------------------- id conversation_id name -- -----------
CONVERSATIONS CONVERSATION_PARTICIPANTS
------------- -------------------------
id conversation_id name
-- --------------- ----
1 1 u1
2 1 u2
3 2 u1
4 3 u1
我期望以下输出([参与者输入]=>[对话输出]):
- [u1]=>[2,3]
- [u2]=>[]
- [u1,u2]=>[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))
如果不想为输入使用(临时)表
,则可以使用动态返回值的子查询替换该表:
... FROM Input ...
... FROM (SELECT 'u1' AS Name UNION ALL SELECT 'u2') AS Input ...