2011-09-29 85 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拍卖)

会给你连接到不存在的拍卖地段,根据需要修改您的其他情况。