sql >> Database >  >> RDS >> Oracle

Oracle-query om alle waarden in de lijst te matchen tussen alle rijen in de tabel

Oracle-configuratie :

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;

Query - Gebruik GROUP BY en 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

Uitvoer :

A
-
a

Query - De lijst dynamisch doorgeven :

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 );

Waar de bindvariabele :your_list is van het type stringlist .

Als de lijst wordt doorgegeven als een tekenreeks met scheidingstekens, kunt u een van de technieken gebruiken in de Gescheiden strings splitsen documentatiepagina om het te scheiden. Er is een eenvoudige PL/SQL-functie dat zou het teruggeven als een verzameling die zou kunnen worden aangesloten op de bovenstaande zoekopdracht.

Bijwerken :

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;

of

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;


  1. subquery in FROM moet een alias hebben

  2. 3 manieren om alle opgeslagen procedures in een PostgreSQL-database op te sommen

  3. MySQL Auto increment primaire sleutel neemt toe met 10

  4. Postgresql-schemapad permanent instellen