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一点问题也没有,不过我鼓励你在下次发帖时,把所有相关信息都包括进来,比如你上面提到的信息!