2014-10-30 94 views
0

我有一個查詢與Union-Statement,我檢索所有UserIds它們存在於table訂單Requester & ProviderColumn刪除,聲明與聯盟將無法正常工作

SELECT Requester 
FROM Orders 
UNION 
SELECT Provider 
FROM Orders 

This query yields some 7000 results in under a second. 

現在我有一個名爲 'Persons',其中那些UserIdslinked to the persons data表。 使用上面的查詢我想清理這個表,只保留上面的union-statement結果中存在的UserIds。

所以,我提出以下刪除語句:

DELETE FROM 
Persons 
WHERE 
UserId NOT IN(

SELECT Requester 
FROM Orders 
UNION 
SELECT Provider 
FROM Orders 
) 

然而,這個查詢拒不執行(即使5分鐘後等待)。什麼可能是我的查詢失敗的原因?我不允許在子查詢中使用UNION作爲語句嗎?

注: 以下MySQL DELETE FROM with UNION subquery by IN condition沒有解決它對我來說。

+0

將'delete from'替換爲'select * from'會發生什麼?另一種方法 - 將聯合查詢的結果存儲在臨時表中,並在'刪除'查詢中使用它。 – 2014-10-30 10:33:48

+0

慢下來。但產生的結果。難道是因爲我過度使用'In'語句? – User999999 2014-10-30 10:36:21

回答

1

該查詢起作用。這需要很長時間。也許下面的效率會更高:

DELETE FROM Persons 
    WHERE UserId NOT IN (SELECT DocAuthor FROM Document WHERE DocAuthors IS NOT NULL) AND 
      UserId NOT IN (SELECT DocActualApprovers FROM Document WHERE DocActualApprovers IS NOT NULL); 

然後,對於性能,這將是最好有(至少)兩個指標:Document(DocAuthor)DocAuthor(DocActualApprovers)。請注意,如果DocAuthorDocActualApproversNULL,您的原始查詢將不會刪除任何內容。據推測,這不是你想要的;因此,where條款。

編輯:

您可能會發現not exists工作速度快:

DELETE FROM Persons p 
    WHERE NOT EXISTS (SELECT DocAuthor FROM Document d WHERE d.DocAuthor = p.UserId) AND 
      NOT EXISTS (SELECT DocActualApprovers FROM Document WHERE d.DocActualApprovers = p.UserId); 

同樣的指標將有助於在這裏。

+0

謝謝你指出我''無'問題!您的查詢有效,但仍然很慢。不知何故,我覺得像'陳述'是傷害我的表現 – User999999 2014-10-30 10:39:03