我有2个表,通过外键连接,字段为UploadID
。
我想从数据库中删除一些行。我尝试了几个不起作用的SQL查询。
现在我有一个我认为应该做的但却得到错误的那个:
Msg 102,Level 15,State 1,Line 2
附近的语法不正确
','。
DELETE
a, b FROM [Uploads] as a,
[OrderLines] as b
WHERE [Uploads].UploadID < 53436;
有什么想法吗?
答案 0 :(得分:6)
您只能在SQL Server
中一次删除1个表但是如果你的密钥设置为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 ...类似下面的
DELETE
b FROM [Uploads] as a,
JOIN [OrderLines] as b on A.SomeColumns = b.SomeColumn
WHERE a.UploadID < 53436;
你几乎有笛卡尔积(交叉连接)
答案 1 :(得分:1)
您的设计听起来像是可以使用TSQL的CASCADE功能。基本上,这将允许您设计表格,以便删除Upload
也将始终清除Orderline
(或相反)。
http://msdn.microsoft.com/en-us/library/aa933119(v=SQL.80).aspx
答案 2 :(得分:1)
(首先让我说我知道DB)
我知道您要删除旧的上传内容。而不是这样做,重写C#/ asp.NET代码,只显示40天以下的上传。
答案 3 :(得分: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