Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Truy vấn Oracle để khớp tất cả các giá trị trong danh sách giữa tất cả các hàng trong bảng

Thiết lập 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;

Truy vấn - Sử dụng GROUP BYCOUNT( 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

Đầu ra :

A
-
a

Truy vấn - Chuyển danh sách động :

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

Nơi biến liên kết :your_list thuộc loại stringlist .

Nếu danh sách được chuyển dưới dạng chuỗi phân tách thì bạn có thể sử dụng bất kỳ kỹ thuật nào trong Tách các chuỗi được phân tách trang tài liệu để tách nó ra. Có một hàm PL / SQL đơn giản điều đó sẽ trả về nó dưới dạng một bộ sưu tập có thể được cắm vào truy vấn trên.

Cập nhật :

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;

hoặc

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. Trình kích hoạt SQL cho Chế độ xem

  2. Cài đặt ROracle ::Không thể tải lỗi đối tượng được chia sẻ

  3. Oracle 10g Blob nhỏ hoặc Clob không được lưu trữ nội tuyến?

  4. Gặp lỗi PLS-00201 khi tạo một loại trong oracle

  5. SQL để tự động tạo ngày bị thiếu và giá từ ngày trước đó ngay lập tức cho ngày bị thiếu trong bảng