2011-08-31 82 views
4

我有兩個通過外鍵連接的表,字段UploadID使用外鍵從多個表中刪除SQL

我想從數據庫中刪除一些行。我嘗試了幾個SQL查詢,這將無法正常工作。

現在我有這樣的一個我認爲應該做的伎倆,但得到的錯誤:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near ','.

DELETE 
    a, b FROM [Uploads] as a, 
    [OrderLines] as b 
    WHERE [Uploads].UploadID < 53436; 

有什麼想法?

回答

1

(首先讓我說,我知道DB)

我知道你想刪除舊的上傳。而不是這樣做,重寫C#/ asp.NET代碼以僅顯示比40天年輕的上傳。

6

您可以從1代表在SQL Server中的時間

但只能刪除,如果你有你的鑰匙設置與cascade delete那麼如果從父表中刪除,那麼他們將被自動從子表中刪除

否則你需要運行兩個DELETE語句,第一個爲子行,然後一個父行

這樣的事情......但是我很不解.. 哪裏是你的JOIN條件?

DELETE 
    b FROM [Uploads] as a, 
    [OrderLines] as b 
    WHERE [Uploads].UploadID < 53436; 

DELETE 
    [Uploads] 
    WHERE [Uploads].UploadID < 53436; 

我更願意用新的樣式ANSI JOIN..like以下

DELETE 
    b FROM [Uploads] as a, 
    JOIN [OrderLines] as b on A.SomeColumns = b.SomeColumn 
    WHERE a.UploadID < 53436; 

你很可能已經笛卡爾積(交叉連接)

0

你需要從刪除子表首先是父母。

CREATE TABLE #TEMPTABLE(ID INT) 
INSERT INTO #TEMPTABLE(ID) 
SELECT UPLOADID FROM ORDERLINES WHERE UPLOADID < 53436; 

DELETE FROM ORDERLINES WHERE UPLOADID < 53436; 
DELETE FROM UPLOADS WHERE UPLOADID IN (SELECT ID FROM #TEMPTABLE) 

DROP TABLE #TEMPTABLE 
1

您的設計聽起來像您可以使用TSQL的CASCADE功能。基本上,這將允許您設計您的表格,以便刪除Upload將始終清除Orderline(或其他方式)。

http://msdn.microsoft.com/en-us/library/aa933119(v=SQL.80).aspx

+0

這聽起來不錯,但我不能妥協它首先放棄僞造鍵來重新創建它。我不能丟失任何數據,因爲它是一個帶有重要數據的實時運行系統 – middelpat