2016-11-07 98 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') 
)