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

Mysql 仅当某行缺少特定值时才返回该行的查询,mysql,sql,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

我有一个数据集,它的结构与此类似,为了便于解释,大大简化了:

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方法吗

完整数据集包含11633065行和2973458个唯一CUI

我正在使用MySQL 5.6.19。

尝试以下查询:

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

select distinct cui  
from foo where CUI not in (select distinct CUI from foo 
                     where  SAB = 'SNOMEDCT_US')
试着这样做:

select distinct cui  
from foo
where CUI not in (select CUI 
                  from foo 
                  where  SAB = 'SNOMEDCT_US')
试试这个:

select distinct cui 
from tbl
where cui not in
(
 select cui from tbl  
 where sab = 'SNOMEDCT_US'
)
子查询返回cui的所有值,其中sab='SNOMEDCT_US'。因为这些值不应该是最终答案的一部分,所以我们使用not IN过滤掉它们


虽然子查询中的解决方案可行,但从性能角度来看,它可能不是最佳选择。特别是当有大量数据需要扫描时

我相信在MySQL 5.6中,它与以前的版本相同。Optimizer将子查询中的此项转换为相关子查询。关联子查询的缺点是,它是针对每一行执行的。这可能导致经济放缓

根据您的需要和情况(行数、数据类型、读取数等),就查询执行时间而言,这可能是更好的选择:

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

了解同一问题的更多解决方案也很好,可以选择:-

为什么要创建子查询?这将比将where子句更改为“SNOMEDCT_US”对性能更有害。因为OP desn不想看到C0074393我知道。但原则仍然是一样的,对吗?我可能错了,如果你能帮我理解,我会很高兴。@shree.pat18现在我明白我做错了什么,谢谢你的帮助!我已经编辑了我的答案!。不幸的是,这不起作用:在我的示例中,它返回两个cui,因为cui=C0074393的两行都有SAB!=偷看我们@shree.pat18在对另一个答案的评论中,在sqlfiddle上显示了这一点。是的,这对我来说是有意义的:我有点惭愧,我没能自己弄清楚这一点。我所做的唯一更改是在子选择上使用distinct,因为给定CUI可能有多个SNOMEDCT_US条目,但我在问题中没有注意到这一点。谢谢。@TreeRex一点问题也没有,不过我鼓励你在下次发帖时,把所有相关信息都包括进来,比如你上面提到的信息!