Eu tenho 2 mesas. 1 contendo meus tópicos e 1 contendo os usuários vinculados a esses tópicos.
Eu quero encontrar o ThreadID com 2 UserIDs específicos anexados, nem mais nem menos.
Isto é o que eu vim com:
SELECT mt.ThreadID
FROM MessagesThreads AS mt
WHERE (SELECT COUNT(DISTINCT mtau.UserID)
FROM MessagesThreadsAccessUsers AS mtau
WHERE
mtau.ThreadID = mt.ThreadID
AND EXISTS (
SELECT 0
FROM MessagesThreadsAccessUsers AS mtau2
WHERE mtau2.ThreadID = mtau.ThreadID
AND mtau2.UserID = 1
)
AND EXISTS (
SELECT 0
FROM MessagesThreadsAccessUsers AS mtau2
WHERE mtau2.ThreadID = mtau.ThreadID
AND mtau2.UserID = 2
)
) = 2
Esta situação específica é sobre encontrar o ThreadID com UserID 1 e UserID 2 anexados. Se nenhum ThreadID for encontrado, preciso criar um novo mais adiante no caminho.
Minha pergunta é: esta é a melhor maneira de consultar isso ou pode ser mais inteligente?
Você marcou sua pergunta com "t-sql", então aqui vai (embora eu ache/espere que isso deva ser compatível com ANSI SQL):
Isso provavelmente é mais eficiente do que um GROUP BY com SUM()s condicionais, especialmente se você tiver um índice em MessageThreadAccessUsers que cubra as colunas (ThreadID, UserID). Se os usuários forem distintos para cada encadeamento, você pode até remover DISTINCT.
Edit: Adicionado LEFT JOIN e WHERE .. IS NULL para excluir quaisquer outros usuários.