mysql - SQL WHERE NOT EXISTS 查询不返回结果

标签 mysql sql sql-server impala

我在构建查询并让它在 impala 上运行时遇到问题。我创建了以下工作查询来连接两个表:

SELECT *
FROM illuminavariant as vcf, ensembl_genes as ens 
WHERE vcf.filter = "PASS" 
AND vcf.qual > 100 
AND vcf.chromosome = ens.chromosome
AND vcf.position BETWEEN ens.start AND ens.stop

现在我正在尝试编写一个查询来查找所有变体 WHERE vcf.filter = "PASS"和 vcf.qual > 100,但没有匹配的染色体和位置。

我已经试过了:

SELECT * 
FROM p7dev.illumina_test, p7dev.ensembl_test
WHERE NOT EXISTS(
  SELECT * 
  FROM p7dev.illumina_test as vcf, p7dev.ensembl_test as ens
  WHERE vcf.chromosome = ens.chromosome  
  AND vcf.position BETWEEN ens.start AND ens.stop  
 )

但这并没有返回任何结果。我认为 WITH 子句可能会起到作用,但如果有人能帮助我理解它如何工作的逻辑,我将不胜感激。非常感谢!

最佳答案

由于您正在寻找与任何整体都不相关的变体,因此形成变体和整体的交叉连接以从中过滤掉行似乎很奇怪。不过,如果那真的是您想要的,那么应该这样做:

SELECT *
FROM illuminavariant as vcf, ensembl_genes as ens 
WHERE vcf.filter = "PASS" 
AND vcf.qual > 100 
AND (
    vcf.chromosome != ens.chromosome
    OR vcf.position < ens.start
    OR vcf.position > ens.stop
  )

这只是否定了将变体行与整体行相关联的条件。

不过,我怀疑您真正想要的更像这样:

SELECT vcf.*
FROM
  illuminavariant as vcf
  LEFT JOIN ensembl_genes as ens 
    ON vcf.chromosome = ens.chromosome
    AND vcf.position BETWEEN ens.start AND ens.stop
WHERE
  vcf.filter = "PASS" 
  AND vcf.qual > 100
  AND ens.chromosome IS NULL

执行与您的第一个查询相同的连接,但作为左连接。实际表示匹配的行然后被 ens.chromosome IS NULL 条件过滤掉。它仅返回变体表的列,因为关键是要找到在整体表中没有对应行的变体。

关于mysql - SQL WHERE NOT EXISTS 查询不返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29544830/

相关文章:

mysql - 在 MySQL 中存储复杂的 perl 数据结构

sql - 在 SQL 中将零添加到产品编号

c# - 改进 Entity Framework 插入

sql-server - 在 SQL 的 xml 列中搜索多个值

mysql - 从 GKE 连接到 AWS 数据库

php - SQL 类问题 - 在 null 上调用成员函数 - phpBB

PHP更新数据到mysql( undefined variable 的错误)

存储为字符串的时间戳的 SQL 平均时间

mysql - 从 JOIN 中选择列,同时对具有公共(public)属性的行进行求和(MySQL 或 SQL Server)

mysql - SQL:按 Select with Join 的结果删除