2016-11-28 33 views
1

我有两张表,在pmid上有一对多关联。所以如果一个表有pmid,第二个表应该有多个具有相同pmid的行。然而,一些东西横向出现,我在第二张表中错过了我最新的一批pmids。这些查询应该有助于说明问题,但我无法弄清楚如何从第一个表中实际缺少的第二个表中获取ID。识别其他表中不存在的值

select count(*) from abstract_mesh am; #2167101 

select count(*) from abstract_mesh am 
join abstracts a on am.pmid = a.pmid; #2133848 

select 2167101 - 2133848; #33253 

select count(*) from abstract_mesh where pmid is NULL; #33253 

因此,您可以看到abstract_mesh中有33,253行没有pmids。我只是想从摘要表中确定哪些pmids应该感兴趣。

+0

https://explainextended.com/2009/09/15/not-in -vs-not-exists-vs-left-join-is-null-sql-server /如果你想读一些 – Blag

回答

1

您可以使用NOT EXITS过滤记录,例如,

select * 
from table1 t1 
where not exists 
select * from table2 t2 where t1.pmid = t2.pmid; 
+0

你的标准SQL是无效的;涉及'table2'的表格表达式需要被包含在parens中。这真的在mySQL上工作吗?附:你还没有使用OP的表格名称,所以SO模块对样板答案采取了一种模糊的观点。 – onedaywhen

+0

那么,我想建议一个OP的选项如何做,而不是服务板上的答案。另外,就'NOT IN'而言,它被认为是一种不好的做法,这个SO答案解释了为什么(http://stackoverflow.com/questions/173041/not-in-vs-not-exists)。 –

+0

如果我对SO有-2点的SQL我已经发布了别人声明是'坏习惯',那么我会......好吧,我拥有的点数:)你链接的页面是关于优化,而不是语义。为什么SQL Land中的过早优化不会像其他语言一样过早优化?为什么SQL供应商不能构建能够识别语义等价查询的优化器? – onedaywhen

0

您需要并反加入。 SQL缺少显式的反连接运算符。标准SQL有EXCEPT(关系minus)由mySQL缺乏这一点。在这里我使用NOT IN <table expression>模拟反连接(虽然不是100%肯定,我有表轮以正确的方式):

SELECT DISTINCT pmid 
    FROM abstract_mesh 
    WHERE pmid NOT IN (SELECT pmid FROM abstracts);