2014-01-15 28 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