sql >> Database teknologi >  >> RDS >> Oracle

Oracle-forespørgsel for at matche alle værdier på listen blandt alle rækker i tabellen

Oracle-opsætning :

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;

Forespørgsel - Brug GROUP BY og 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

Output :

A
-
a

Forespørgsel – videregivelse af listen dynamisk :

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

Hvor bindevariablen :your_list er af typen stringlist .

Hvis listen videregives som en afgrænset streng, kan du bruge enhver af teknikkerne i Opdeling af afgrænsede strenge dokumentationsside for at adskille den. Der er en simpel PL/SQL-funktion der ville returnere det som en samling, der kunne tilsluttes ovenstående forespørgsel.

Opdater :

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;

eller

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. begrænse rækkerne til hvor summen af ​​en kolonne svarer til en bestemt værdi i MySQL

  2. SQL UPDATE med underforespørgsel, der refererer til den samme tabel i MySQL

  3. Postgres tilføjer kolonne med oprindeligt beregnede værdier

  4. Antal gange et bestemt tegn optræder i en streng