sql >> Databáze >  >> RDS >> Oracle

Oracle dotaz, aby odpovídal všem hodnotám v seznamu mezi všemi řádky v tabulce

Nastavení 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;

Dotaz – použijte GROUP BY a 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

Výstup :

A
-
a

Dotaz – dynamické předávání seznamu :

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

Kde je proměnná vazby :your_list je typu stringlist .

Pokud je seznam předán jako řetězec s oddělovači, můžete použít kteroukoli z technik v Rozdělení řetězců s oddělovači dokumentační stránku pro její oddělení. Existuje jednoduchá funkce PL/SQL to by jej vrátilo jako kolekci, kterou lze zapojit do výše uvedeného dotazu.

Aktualizovat :

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;

nebo

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. je dočasná tabulka mysql jedinečná pro každého uživatele, který přistupuje ke skriptu, který ji vytváří...?

  2. Váš dokonalý průvodce SQL Join:INNER JOIN – Část 1

  3. INSERT více položek z Android -> PHP -> MYSQL

  4. MySQL získá seřazený seznam kontaktů podle poslední odeslané/přijaté zprávy