仅当该行缺少特定值时才返回行的查询

时间:2014-08-04 17:20:47

标签: mysql sql

我有一个数据集,其结构与此类似(出于说明目的而大大简化):

CREATE TABLE FOO (
  CUI CHAR(8),
  SAB VARCHAR(40),
  CODE VARCHAR(50),
  KEY X_CUI (CUI)
);

没有主键:有多个行具有相同的CUI值:

C0000039    MSH          D015060
C0000039    NDFRT        N0000007747
C0000039    LNC          LP15542-1
C0074393    RCD          da5..
C0074393    RXNORM       36437
C0074393    SNOMEDCT_US  96211006

我想找到没有SNOMEDCT_US SAB的所有唯一CUI值。在上面的示例中,C0000039将位于结果集中,但C0074393不会。

不幸的是,这超出了我的基本SQL技能:有人可以在SQL中建议一种方法吗?

完整数据集包含11,633,065行和2,973,458个唯一CUI。

我正在使用MySQL 5.6.19。

5 个答案:

答案 0 :(得分:3)

尝试此查询:

SELECT DISTINCT CUI 
FROM FOO 
WHERE SAB != 'SNOMEDCT_US' 
      AND CUI NOT IN (SELECT DISTINCT CUI FROM FOO WHERE SAB = 'SNOMEDCT_US')

答案 1 :(得分:3)

尝试这种方式:

select distinct cui  
from foo
where CUI not in (select CUI 
                  from foo 
                  where  SAB = 'SNOMEDCT_US')

答案 2 :(得分:3)

试试这个:

select distinct cui 
from tbl
where cui not in
(
 select cui from tbl  
 where sab = 'SNOMEDCT_US'
)

子查询返回cui的所有值,其中sab =' SNOMEDCT_US'。由于这些值不应该是最终答案的一部分,因此我们使用NOT IN过滤掉它们。

SQLFiddle

答案 3 :(得分:2)

试试这个:

select distinct cui  
from foo where CUI not in (select distinct CUI from foo 
                     where  SAB = 'SNOMEDCT_US')

SQL Demo

答案 4 :(得分:0)

虽然使用IN子查询的解决方案可行,但从性能角度来看,它可能不是最佳选择。 ESP。如果要扫描大量数据。

我相信在MySQL 5.6中它与以前的版本相同。优化器将此IN子查询转换为相关子查询。相关子查询的缺点 - 它是为每一行执行的。这可能会导致放缓。

根据您的需求和情况(没有行,数据类型,没有读取等),这可能是查询执行时间方面的更好选择:

SELECT CUI
FROM FOO
GROUP BY CUI
HAVING SUM(1) = SUM(IF(('SNOMEDCT_US') IN (SAB), 0, 1))

同样很高兴知道有同样问题的更多解决方案可供选择: - )