2016-11-28 16 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);