sql >> Databasteknik >  >> RDS >> Oracle

Oracle-fråga för att matcha alla värden i listan bland alla rader i tabellen

Oracle-inställningar :

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;

Fråga - Använd GROUP BY och 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

Utdata :

A
-
a

Fråga – Skicka listan dynamiskt :

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

Där bindningsvariabeln :your_list är av typen stringlist .

Om listan skickas som en avgränsad sträng kan du använda någon av teknikerna i Dela avgränsade strängar dokumentationssida för att separera den. Det finns en enkel PL/SQL-funktion som skulle returnera den som en samling som skulle kunna kopplas till ovanstående fråga.

Uppdatera :

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. MySQL LIKE begränsande

  2. Extremt grundläggande PHP och Mysql

  3. mysql kan inte ge användaren behörighet, får felmeddelande:ERROR 1819 (HY000):Ditt lösenord uppfyller inte de nuvarande policykraven

  4. Summan av flera MySQL-kolumner lagrade i en annan kolumn?