Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Consulta Oracle para corresponder a todos os valores da lista entre todas as linhas da tabela


Configuração do Oracle :
CREATE TABLE table_name ( ID, A, B ) AS
SELECT 1,    'a',     'a1' FROM DUAL UNION ALL
SELECT 2,    'b',     'b1' FROM DUAL UNION ALL
SELECT 3,    'a',     'a2' FROM DUAL UNION ALL
SELECT 4,    'c',     'a1' FROM DUAL UNION ALL
SELECT 5,    'b',     'b2' FROM DUAL;

Consulta - Use GROUP BY e COUNT( DISTINCT ... ) :
SELECT A
FROM   table_name
WHERE  B IN ( 'a1', 'a2' )      -- The items in the list
GROUP BY A
HAVING COUNT( DISTINCT b ) = 2; -- The number of items in the list

Saída :
A
-
a

Consulta - Passando a lista dinamicamente :
CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(10);
/

SELECT A
FROM   table_name
WHERE  B MEMBER OF :your_list
GROUP BY A
HAVING COUNT( DISTINCT B ) = CARDINALITY( :your_list );

Onde a variável de ligação :your_list é do tipo stringlist .

Se a lista for passada como uma string delimitada, você poderá usar qualquer uma das técnicas no Dividindo strings delimitadas página de documentação para separá-lo. Existe uma função PL/SQL simples que a retornaria como uma coleção que poderia ser conectada à consulta acima.

Atualizar :
SELECT A
FROM   table_name
GROUP BY A
HAVING COUNT( DISTINCT CASE WHEN b IN ( 'a1', 'a2' )     THEN b END ) = 2
AND    COUNT( DISTINCT CASE WHEN b NOT IN ( 'a1', 'a2' ) THEN b END ) = 0;

ou
SELECT A
FROM   table_name
GROUP BY A
HAVING COUNT( DISTINCT CASE WHEN b MEMBER OF :your_list     THEN b END ) = CARDINALITY( :your_list )
AND    COUNT( DISTINCT CASE WHEN b NOT MEMBER OF :your_list THEN b END ) = 0;