MySQL:在多个表中获取孤儿

时间:2014-01-15 16:36:57

标签: 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未在registrationsstore_orders中表示,因此被视为孤立事务。有些交易只会进行注册。有些人只会有商店订单。有些人会同时拥有。这样做的目的是从事务表中消除在其他任何表中没有相应条目的行。

1 个答案:

答案 0 :(得分: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中没有相应条目的交易。

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