我有一个数据集,其结构与此类似(出于说明目的而大大简化):
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。
答案 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
过滤掉它们。
答案 3 :(得分:2)
试试这个:
select distinct cui
from foo where CUI not in (select distinct CUI from foo
where SAB = 'SNOMEDCT_US')
答案 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))
同样很高兴知道有同样问题的更多解决方案可供选择: - )