Esta pode ser uma pergunta boba, e minha suspeita é que não posso fazer isso, mas existe uma construção no SQL que me permitiria fazer algo como o seguinte:
SELECT whatever WHERE col1,col2 IN ((val1, val2), (val1, val2), ...)
Eu quero selecionar dados onde duas colunas estão em um conjunto de pares.
Eu gostaria de evitar o uso de uma subconsulta, se possível.
Sim, existe, quase exatamente como você escreveu. Basta colocar
col1, col2
entre parênteses:No entanto, se você tentar em um DBMS, poderá descobrir que não funciona. Porque nem todos os DBMS implementaram todos os recursos do padrão SQL (evolutivo). Isso funciona nas versões mais recentes do Oracle, MySQL, Postgres, DB2 e HSQLDB (não foi bem otimizado no MySQL e não usa índices, portanto deve ser evitado lá, a menos que eles o corrigissem em 5.7).
Veja a documentação do MySQL sobre o
IN
operador e a documentação do Postgres sobre os construtores Row . Os dois* (ou mais) valores entre parênteses são chamados de construtor de linha .Outras formas que expressam a mesma ideia:
Ambos funcionam em Postgres e DB2 (afaik). O último também pode ser modificado para funcionar no SQL Server:
Ele também pode ser modificado para funcionar em qualquer lugar, colocando os valores em uma tabela (temporária ou permanente) primeiro:
E há sempre o caminho longo ou converter o
IN
para uma expressão longaOR
que deve funcionar em todos os lugares:*: Na verdade, pode ser apenas um valor, com
ROW(v)
, consulte a documentação do Postgres.