从多对多关系中精确匹配一组行的SQL SELECT

时间:2014-08-04 20:45:50

标签: android sql sqlite

我在Android应用程序中有一个带有对话和参与者表的SQLite3数据库。我想要一个查询,给定参与者列表,只返回其参与者列表与给定参与者列表完全匹配的那些会话。例如,给定这些表:

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]

我已经看到了涉及连接参与者名称的有序列表的解决方案,但是如果可能的话,我宁愿不去那条路线。这样的事情可能吗?没有临时表?

1 个答案:

答案 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 ...