2011-09-29 84 views
0

我剛剛開始研究其他人放在一起的MySQL數據庫,並且我正在嘗試清理它。我的問題有三個相關的表格 - 一張表格列出了拍賣,一張表格列出了每次拍賣中出售的拍賣品以及一張表格,列出了每個拍賣品的付款時間表。查找多表MySQL數據庫中的缺失行

拍賣表使用主鍵來標識每個拍賣,並且每個拍賣都有這個關鍵字來標識拍賣。同樣,每個批次都有一個不同的密鑰,每次付款都用於識別批次。每個拍賣應該至少有一個批次,每批應該至少有一個付款。沒有支付應附加到很多表格中沒有行的批次,也不應將批次附加到拍賣表格中沒有行的拍賣。我試圖找出一個查詢,這將允許我查找違反此規則的行 - 例如,在批次表中缺少大量或附加很多的額外付款。

目前我正在做一個數不同的查詢,它給了我在相關表中提到的拍賣數量,但如果數字不匹配,它不會幫助我找到哪些丟失。有沒有可用於查找缺少的行的查詢?

謝謝

回答

2

您可以檢查相關表中的密鑰。

Select a.* from Auction a 
Left Join Lot l on l.key = a.key 
where l.key is null 

select * from Auction a 
where a.key not in (select key from lot) 

像這些都會幫助你。您需要更改表名和列名以匹配,然後爲其他適當情況編寫一些腳本,但邏輯應該是相似的。希望這可以幫助。

+0

或'不存在(選擇*從批次WHERE鍵= Auction.key)'。據我所知,它通常是完成反半連接的最佳方式。 'LEFT JOIN'選項通常是最差的。這是否適用於MySQL我不知道。值得在大型樣本數據集上進行三項試驗。 – MatBailie

+1

我的印象是,查詢優化處理了這一點,Not In和Left join表現幾乎完全相同,並且not exists方法在某些情況下效率略低。更何況涉及索引。 rescource:http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/ –

0

喜歡的東西,

SELECT lot.pk從很多 WHERE lot.fk NOT IN(SELECT DISTINCT(auction.pk)FROM拍賣)

會給你連接到不存在的拍賣地段,根據需要修改您的其他情況。