简体   繁体   中英

oracle sql how to select specific distinct set in group by function

Table

--------------------------------------------------
| Col1               | Col2                      |
--------------------------------------------------
| A                  | 1                         |
--------------------------------------------------
| A                  | 2                         |
--------------------------------------------------
| A                  | 3                         |
--------------------------------------------------
| B                  | 3                         |
--------------------------------------------------
| B                  | 4                         |
--------------------------------------------------
| B                  | 5                         |
--------------------------------------------------
| C                  | 4                         |
--------------------------------------------------
| C                  | 6                         |
--------------------------------------------------
| C                  | 3                         |
--------------------------------------------------

how to select distinct col1 that has 3 and 4 (answer is B, C)

Thanks in advance

You can use two IN clauses (or EXISTS ):

SELECT DISTINCT col1
FROM Table
WHERE 
COL1 IN (SELECT Col1 FROM Table WHERE Col2 = 3)
AND
COL1 IN (SELECT Col1 FROM Table WHERE Col2 = 4)

Or this GROUP BY

SELECT Col1 FROM Table
WHERE Col2 IN (3,4)
GROUP BY Col1
HAVNG COUNT(DISTINCT Col2) = 2

SQL Fiddle

Oracle 11g R2 Schema Setup :

CREATE TABLE tbl (Col1, Col2 ) AS
          SELECT 'A', 1 FROM DUAL
UNION ALL SELECT 'A', 2 FROM DUAL
UNION ALL SELECT 'A', 3 FROM DUAL
UNION ALL SELECT 'B', 3 FROM DUAL
UNION ALL SELECT 'B', 4 FROM DUAL
UNION ALL SELECT 'B', 5 FROM DUAL
UNION ALL SELECT 'C', 4 FROM DUAL
UNION ALL SELECT 'C', 6 FROM DUAL
UNION ALL SELECT 'C', 3 FROM DUAL;

CREATE OR REPLACE TYPE NUMBERs_Table AS TABLE OF NUMBER(1);

Query 1 :

SELECT   Col1
FROM     tbl
GROUP BY Col1
HAVING   NUMBERs_Table(3,4) SUBMULTISET OF CAST( COLLECT( Col2 ) AS NUMBERs_Table )

Results :

| COL1 |
|------|
|    B |
|    C |

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM