2009-06-10 82 views
2

給定一個SQL語句:我如何通過從SQL select語句返回的行列表的迭代?

select id from myTable 
where id = -1 

如何通過每個結果的重複?我想對每個結果執行特定操作,例如(以僞代碼形式):

foreach (result from my statment) 
{ 
    delete all rows from myOtherTable that has a value of result; 
} 

我該如何編寫SQL語句來執行此操作?

N.B.我想這樣做的原因是因爲我想要刪除的行的表被其他表引用。所以我想,如果我刪除引用此特定行所有表中的行,然後刪除該行一切都會好起來。

回答

8

你並不需要在SQL迭代,你可以在一個聲明中寫

DELETE FROM myOtherTable 
WHERE myTableId IN (SELECT id FROM myTable WHERE id = -1) 

編輯:

完成之後,先刪除然後就可以從原始表中刪除

DELETE FROM myTable WHERE id = -1 
+2

如果將myOtherTables上的外鍵設置爲myTable並且級聯刪除將起作用,那麼甚至可能不需要執行刪除myOtherTable WHERE myTableId IN(SELECT id FROM myTable WHERE id = -1),而是僅刪除FROM myTable WHERE id = -1。 – 2009-06-10 14:04:22

+0

@sheepsimulator,你是對的。 – 2009-06-10 14:15:50

2

您可以使用遊標,但這些都是由大慢,不應該被使用。

你可以做的是這樣的:

DELETE FROM a 
FROM 
    myOtherTable a 
    INNER JOIN myTable b ON 
     a.value = b.value 
     AND b.id = -1 

我一般喜歡下手:

SELECT a.* 
--DELETE FROM a 

要我的查詢,以便我可以檢查結果,然後刪除它們時,我知道我得到正確的價值。

2

能做到每一個「其他」表一擊如

DELETE 
    FROM myOtherTable 
WHERE EXISTS (
       SELECT * 
       FROM myTable AS M1 
       WHERE M1.SomeValue = myOtherTable.SomeValue 
         AND M1.ID = -1 
      ); 
2

你不需要在sql中迭代。

DELETE FROM table2 
WHERE Id IN (SELECT id FROM table1 WHERE id = -1) 

如果您需要在SQL循環中,您可以使用

while 
7

其他答案基本上是正確的。良好的SQL代碼通常需要與程序或面向對象程序員習慣思考的方式不同的思維方式。 SQL經過優化,可以對數據集執行操作。你DELETE FROM table2 WHERE ...語句發送到後端數據庫,該數據庫知道如何最有效地採取這一說法,並立即在整個結果集進行操作。

其中一個原因是因爲許多大型應用程序具有前端(用戶界面),接受用戶請求的服務器(例如:Web服務器)和後端數據庫服務器。對於在Web服務器上執行的SQL代碼(您的SQL腳本可能來自的位置),必須向後端發出單個請求以刪除表中的每個項目。從Web服務器發送到數據庫服務器的消息將看起來像這樣(僞代碼信息):

web server -> Find all elements matching criteria -> database 
web server <-  (return of matching elements)  <- database 
web server -> Delete element[0] from myTable  -> database 
web server <-  (delete result was ok)    <- database 
web server -> Delete element[1] from myTable  -> database 
web server <-  (delete result was ok)    <- database 
.... 

然而,在SQL方法將產生的消息來回會看起來更像:

web server -> Find all elements matching criteria -> database 
        and delete them. 
web server <-  (delete result was ok)    <- database