Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle заявка за съвпадение на всички стойности в списъка сред всички редове в таблицата

Настройка на 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;

Заявка - Използвайте GROUP BY и 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

Изход :

A
-
a

Заявка - динамично предаване на списъка :

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

Къде е променливата за свързване :your_list е от тип stringlist .

Ако списъкът се предава като ограничен низ, тогава можете да използвате която и да е от техниките в Разделяне на разделени низове страница с документация, за да го отделите. Има проста PL/SQL функция което ще го върне като колекция, която може да бъде включена в горната заявка.

Актуализация :

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;

или

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. Oracle вмъкнете в table2, след което изтрийте от table1, изключение, ако не успеете

  2. VS2010 + драйвер на Oracle:ORA-12154:TSN:не може да разреши посочения идентификатор за свързване

  3. Как да третираме MAX() на празна таблица като 0 вместо NULL

  4. PLS-00201:трябва да се декларира идентификатор UTIL_FILE

  5. Мигриране на база данни на Oracle от AWS EC2 към AWS RDS, част 4