O objetivo é encontrar um pai, dado que é filhos. Por exemplo, digamos que você tenha um pacote de marketing (também conhecido como "combo") e deseja combiná-lo com base nos produtos nele contidos. Exemplo de tabela/dados:
create table marketing_package_product (
package_id int not null references marketing_package(id),
product_id int not null references product(id),
primary key (package_id, product_id)
);
insert into marketing_package_product values
(1,1),
(1,2),
(1,3),
(2,1),
(2,5);
Dados os produtos 1,2,3, desejo obter o marketing_package 1. Mas, dados apenas os produtos 1,2, não quero o marketing_package 1.
Existe um nome para esse tipo de consulta e qual é a maneira mais eficiente de fazer isso?
O problema que você está resolvendo é chamado de Divisão Relacional com duas variações, a "Divisão com Resto" e a "Divisão Exata" (que se encaixa na sua descrição).
Veja também este artigo: Divided We Stand: The SQL of Relational Division
Esta questão no StackOVerflow: Como filtrar os resultados do SQL em uma relação has-many-through tem algumas maneiras de resolvê-lo e benchmarks para Postgres, mas não é para a variação exata, apenas para a "Divisão com Resto" . As consultas serão semelhantes, mas uma verificação/condição extra deve ser adicionada para a variação exata.
Uma forma (das demais) de resolver isso seria autojuntar a tabela quantas vezes os "produtos" e depois uma checagem extra para que apenas os pacotes com exatamente esses produtos sejam mantidos):
Outra seria to
GROUP BY
e depois duasHAVING
condições, uma para a divisão e outra para a "exatidão":onde
@n
estaria2
neste caso, a quantidade de produtos em seu cheque.Teste no SQL-Fiddle .