2016-11-07 143 views
0

我有一個相當大的,看起來或多或少像這樣的表(10,000條記錄)內有一定地位的所有記錄:SQL查詢來獲取一個外鍵

| id | name | contract_no | status | 
|----|-------|-------------|--------| 
| 1 | name1 | 1022  | A  | 
| 2 | name2 | 1856  | B  | 
| 3 | name3 | 1322  | C  | 
| 4 | name4 | 1322  | C  | 
| 5 | name5 | 1322  | D  | 

contract_no是一個外鍵,其中當然可以出現在幾個記錄中,每個記錄將具有A,B,C,D或E的狀態。

我想要的是獲取所有合同編號的列表,其中所有記錄引用該合同處於狀態C,D,E或這些狀態的混合狀態,但如果任何記錄處於狀態A或狀態B,則省略該合同編號。

是否可以使用SQL查詢來做到這一點?或者我應該更好地導出數據並嘗試使用Python或R等其他語言來運行此分析?

+0

這RDBMS ?........ –

回答

1

帖子彙總篩選應該做的伎倆

SELECT contract_no FROM t 
GROUP BY contract_no 
HAVING SUM(status='A')=0 
AND SUM(status='B')=0 
+0

'HAVIN G SUM(status ='A')+ SUM(status ='B')= 0'? –

+0

也可以是'有和(狀態IN('A','B'))= 0'。 –

+0

兩者都可以。 – Mihai

1

您可以使用group byhaving來獲得這樣的合同號碼。

select contract_number 
from yourtable 
group by contract_number 
having count(distinct case when status in ('C','D','E') then status end) >= 1 
and count(case when status = 'A' then 1 end) = 0 
and count(case when status = 'B' then 1 end) = 0 
1

不,優雅的其他兩個答案,但更多表現:

SELECT DISTINCT contract_no 
FROM the_table t1 
WHERE NOT EXISTS (
    SELECT * 
    FROM the_table t2 
    WHERE t2.contract_no = t1.contract_no 
    AND t2.status IN ('A', 'B') 
) 

或者

SELECT DISTINCT contract_no 
FROM the_table 
WHERE contract_no NOT IN (
    SELECT contract_no 
    FROM the_table 
    AND status IN ('A', 'B') 
)