2015-11-05 86 views
4

請考慮此示例表「Table1」。選擇查詢以獲取對應於列中所有值的行

Col1 Col2 
A  1 
B  1 
A  4 
A  5 
A  3 
A  2 
D  1 
B  2 
C  3 
B  4 

我想從Col1中取對應於所有值(在本例中爲1,2,3,4,5)的那些值。這裏查詢的結果應該返回'A',因爲在Col2中沒有其他所有值都是1,2,3,4,5。

請注意,Col2中的值由查詢中的其他參數決定,它們將始終返回一些數值。在這些值之外,查詢需要從Col1中獲取與Col2中所有對應的值。 Col2中的值可能是11,12,1,2,3,4(例如,不一定按順序)。

我曾嘗試以下選擇查詢:

select distinct Col1 from Table1 where Col1 in (1,2,3,4,5); 

select distinct Col1 from Table1 where Col1 exists (select distinct Col2 from Table1); 

及其不同的變化。但問題是我需要爲Col2應用'和'而不是'或'。

像返回從一個Col1中值,其中col2的「包含」 1和5

之間的所有值欣賞任何建議。

回答

1

你可以使用分析ROW_NUMBER()功能。

SQL FIddle進行設置和工作演示。

SELECT col1 
FROM 
    (SELECT col1, 
    col2, 
    row_number() OVER(PARTITION BY col1 ORDER BY col2) rn 
    FROM your_table 
    WHERE col2 IN (1,2,3,4,5) 
) 
WHERE rn =5; 

UPDATE按照要求由OP,有關查詢是如何工作的一些解釋。

內子查詢爲您提供以下結果集:

SQL> SELECT col1, 
    2 col2, 
    3 row_number() OVER(PARTITION BY col1 ORDER BY col2) rn 
    4 FROM t 
    5 WHERE col2 IN (1,2,3,4,5); 

C  COL2   RN 
- ---------- ---------- 
A   1   1 
A   2   2 
A   3   3 
A   4   4 
A   5   5 
B   1   1 
B   2   2 
B   4   3 
C   3   1 
D   1   1 

10 rows selected. 

PARTITION BY子句將組COL1的各組,並ORDER BY將在COL1的各組集進行排序COL2。因此,子查詢以有序方式爲您提供每行的row_number。現在你知道你只需要那些row_number爲的行至少有5。因此,在外部查詢中,所有您需要的操作是WHERE rn =5來過濾行。

+0

這工作。我會嘗試檢查所有情況。另外,你介意關於查詢的細節嗎?我之前沒有使用OVER或PARTITION查詢參數。 – Hemang

+0

@Hemang它是分析功能。 'PARTITION BY'子句將對每組col1進行分組,'ORDER BY'將按col1的每組分組對col2進行排序。因此,子查詢以有序方式爲您提供每行的row_number。看到更新將解釋。 –

+0

@Hemang請標記爲已回答,會幫助別人。 –

1

可以使用LISTAGG功能,如

SELECT Col1 
FROM 
(select Col1,listagg(Col2,',') within group (order by Col2) Col2List from Table1 
group by Col1) 
WHERE Col2List = '1,2,3,4,5' 
+0

謝謝。首先,我認爲Col2List將在'來自Table1'之前,否則它會給出錯誤。還有一個問題,如果我有額外的'哪裏'的條件,他們會去哪裏?我不能在WHERE Col2List ='1,2,3,4,5'之後添加它們,因爲列'不會被識別,因爲'來自Table1'位於括號內。 – Hemang

+0

我看到了..我編輯了查詢,可以再次測試它嗎? – hkutluay

+0

爲什麼'LISTAGG'? OP不尋找字符串聚合。 –

0

您還可以使用下面

SELECT COL1 
    FROM TABLE_NAME 
    GROUP BY COL1 
    HAVING 
    COUNT(COL1)=5 
    AND 
    SUM(
    (CASE WHEN COL2=1 THEN 1 ELSE 0 
    END) 
    + 
    (CASE WHEN COL2=2 THEN 1 ELSE 0 
    END) 
    + 
    (CASE WHEN COL2=3 THEN 1 ELSE 0 
    END) 
    + 
    (CASE WHEN COL2=4 THEN 1 ELSE 0 
    END) 
    + 
    (CASE WHEN COL2=5 THEN 1 ELSE 0 
    END))=5 
相關問題