Eu não consigo descobrir o que o tsql deve ser para fazer o seguinte.
Gostaria de consultar a tabela Tweets com todos os tweets que possuem categoria 1 e 2 (podem ser mais de 2 categorias passadas)
Portanto, a consulta deve retornar o tweet 1 e 3 para as seguintes inserções
USE tempdb
CREATE TABLE [dbo].[Tweets]([Id] [bigint] NOT NULL)
CREATE TABLE [dbo].[TweetCategories]([TweetId] [bigint] NOT NULL, [CategoryId] [int] NOT NULL)
INSERT INTO Tweets(Id) VALUES(1)
INSERT INTO Tweets(Id) VALUES(2)
INSERT INTO Tweets(Id) VALUES(3)
INSERT INTO Tweets(Id) VALUES(4)
INSERT INTO TweetCategories(TweetId, CategoryId) VALUES(1, 1)
INSERT INTO TweetCategories(TweetId, CategoryId) VALUES(1, 2)
INSERT INTO TweetCategories(TweetId, CategoryId) VALUES(2, 2)
INSERT INTO TweetCategories(TweetId, CategoryId) VALUES(2, 3)
INSERT INTO TweetCategories(TweetId, CategoryId) VALUES(3, 1)
INSERT INTO TweetCategories(TweetId, CategoryId) VALUES(3, 2)
INSERT INTO TweetCategories(TweetId, CategoryId) VALUES(3, 3)
DROP TABLE tweets
DROP TABLE TweetCategories
A eficiência é importante, pois meus tweets terão mais de 2 milhões de registros e as categorias também podem estar em alguns milhões
Como o tamanho da lista não será o mesmo para todas as execuções, você pode tentar Passar parâmetros de matriz para um procedimento armazenado . Aqui está uma maneira de fazer isso:
Para que essa abordagem funcione corretamente, presumo que (TweetId, CategoryId) seja uma chave primária composta, embora seu código de exemplo não a mostre.
Maneira mais fácil, se forem sempre exatamente dois IDs:
Se as categorias a serem consultadas forem flexíveis (número ou CategoryID), você pode querer algo como:
Dependendo de onde / como as categorias a serem consultadas são "enviadas", você pode passá-lo como variável de tabela para seu procedimento (desvantagem: você precisa criar um tipo para isso), passá-lo como lista de string simples ('1,2' no seu exemplo) e divida a string antes de inserir em #categories_to_query ou torne-a rápida e suja declarando, por exemplo, 10 parâmetros para seu procedimento para permitir que até 10 categorias diferentes sejam filtradas.
Em relação ao desempenho: você deve ter um índice em CategoryId, TweetId (nesta ordem!) no dbo.TweetCategories