2014-01-15 21 views
0

我们继承了一个令人讨厌的数据库,其中包含TON的孤立和损坏的数据。我想把它清理干净,但我很难搞清楚如何去做,因为数据跨越了几个表格。基本上,我们有很多没有关联订单的交易。这些交易需要删除,因为它们没有相关的订单信息并导致报告问题。MySQL:在多个表中获取孤儿

表:交易

+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
| 10 | 
+----+ 

表:注册

+----+----------------+ 
| id | transaction_id | 
+----+----------------+ 
| 1 |    10 | 
| 2 |    9 | 
| 3 |    8 | 
| 4 |    7 | 
| 5 |    6 | 
| 6 |    5 | 
| 7 |    4 | 
| 8 |    3 | 
| 9 |    2 | 
| 10 |    2 | 
+----+----------------+ 

表:store_orders

+----------------+ 
| transaction_id | 
+----------------+ 
|    10 | 
|    9 | 
|    8 | 
|    7 | 
|    6 | 
|    5 | 
|    4 | 
|    3 | 
|    2 | 
|    2 | 
+----------------+ 

所以,你会看到我们有交易1-10,我们有注册和商店订单,它们都引用交易表。您看到交易ID 1未在或store_orders中表示,因此被视为孤儿交易。有些交易只会注册。有些将只有一个商店订单。有些会有两个。这样做的目标是消除事务表中没有任何其他表中的相应条目的行。

+0

你问我们的代码? – Kermit

+0

他正在寻求帮助。很明显,如果他知道任何基本的sql,他就不会花时间来问这样一个很好的书面和格式化的问题 – AdrianBR

+0

是的,我在寻求帮助。在使用这个软件的过程中,我花了几个月的时间长期和沮丧,而且由于对这个软件感到沮丧,我已经达到了无法再取得进展的地步。 – Kevin

回答

2
Delete from transactions where transaction_ID IN (
Select ID 
from transactions T 
LEFT JOIN registrations R on T.ID = R.Transaction_ID 
LEFT JOIN store_orders SO on T.ID = SO.Transaction_ID 
WHERE T.Transaction_ID is null and SO.Transaction_ID is null) 
  • 您可以直接运行(的)之间的部分,看看记录它会清除。
  • 你可以现场检查这些结果,以确认它会做你所期望的
  • 然后你可以运行整个事情。

这是获取所有交易,只有那些记录有注册或订单。然后它会从有注册或订单的结果中删除那些记录,只留下那些既没有注册也没有订单的记录。换句话说,只有那些在注册或store_orders中没有相应条目的交易。

使用此列表,然后从事务中删除这些标识。

+0

感谢您的帮助。这表明我朝着正确的方向前进。 – Kevin