Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过多个联接删除行_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

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%')