Sql 通过多个联接删除行
如您所见,我正试图通过连接多个表来删除行,但这会引发一个错误:Sql 通过多个联接删除行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,如您所见,我正试图通过连接多个表来删除行,但这会引发一个错误: DELETE FROM Reg INNER JOIN RegDoc ON Reg.RegId = RegDoc.RegId INNER JOIN Doc ON RegDoc.DocId = Doc.DocId WHERE Doc.Name LIKE N'%Title%' 获取错误: 味精156,第15级,状态1,第1行 关键字“内部”附近的语法不正确 正确的语法是 DELETE [
DELETE FROM Reg INNER JOIN
RegDoc ON Reg.RegId = RegDoc.RegId INNER JOIN
Doc ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'
获取错误:
味精156,第15级,状态1,第1行
关键字“内部”附近的语法不正确
正确的语法是
DELETE [ FROM ] { <object> }
[ FROM <table_source>]
[ WHERE { <search_condition> } ]
请注意对Reg
表的两个引用
这可以通过别名进一步缩短(尽管在这种情况下几乎不需要)
范例 用这个
DELETE
FROM Reg
FROM Reg
INNER JOIN
RegDoc ON Reg.RegId = RegDoc.RegId INNER JOIN
Doc ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'
或者更清楚地说,IMHO:
DELETE Reg
FROM Reg
INNER JOIN RegDoc
ON Reg.RegId = RegDoc.RegId
INNER JOIN Doc
ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'
您可以这样做:
DELETE Reg
FROM Reg
INNER JOIN RegDoc ON Reg.RegId = RegDoc.RegId
INNER JOIN Doc ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'
您可以使用别名,但如果使用与表名不同的别名,则更清楚:
DELETE r
FROM Reg as r
INNER JOIN RegDoc rd ON r.RegId = rd.RegId
INNER JOIN Doc d ON rd.DocId = d.DocId
实际上,您可以
删除rd
和删除d
。与其他答案(都很好)有点不同的方法
如果是
DELETE reg FROM…
no?@Farray-DELETE FROM
是正确的,但是第一个FROM
可能确实被删除了。这有点像写出LEFT-OUTER-JOIN
,其中OUTER
也是多余的,但我仍然倾向于完全写出它。第一个来自的,在从表1中删除为t1
是可选的,但可以正常工作
DELETE Reg
FROM Reg
INNER JOIN RegDoc
ON Reg.RegId = RegDoc.RegId
INNER JOIN Doc
ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'
DELETE Reg
FROM Reg
INNER JOIN RegDoc ON Reg.RegId = RegDoc.RegId
INNER JOIN Doc ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'
DELETE r
FROM Reg as r
INNER JOIN RegDoc rd ON r.RegId = rd.RegId
INNER JOIN Doc d ON rd.DocId = d.DocId
DELETE FROM Reg
WHERE Reg.RegID IN (SELECT RegDoc.RegId
FROM RegDoc
INNER JOIN Doc
ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%')