Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zapytanie Oracle, aby dopasować wszystkie wartości na liście wśród wszystkich wierszy w tabeli

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

Zapytanie — użyj GROUP BY i 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

Wyjście :

A
-
a

Zapytanie – dynamiczne przekazywanie listy :

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

Gdzie zmienna wiązania :your_list jest typu stringlist .

Jeśli lista jest przekazywana jako rozdzielany ciąg, możesz użyć dowolnej z technik opisanych w Dzielenie rozdzielanych ciągów stronę dokumentacji, aby go oddzielić. Istnieje prosta funkcja PL/SQL który zwróciłby go jako kolekcję, którą można by podłączyć do powyższego zapytania.

Aktualizacja :

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;

lub

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizuj kolumnę przy użyciu losowych unikalnych wartości z innej tabeli

  2. Uzyskaj tylko datę bez czasu w Oracle

  3. Funkcja LEAST() w Oracle

  4. Pobierz BLOB z kolumny BFILE w Oracle

  5. Informacje o elemencie formatu V w Oracle