目前我正在阅读一本关于SQL的书,它提供了以下解释:
您需要为分支表的每个实例提供不同的别名,以便服务器知道您在各个子句中引用的是哪一个。
但我无法理解为什么在使用不同的JOIN
子句时,同一个表中的ON
列不可能?为什么服务器需要创建表的第二个实例,然后将它们相互区分?
答案 0 :(得分:2)
因此,在引用JOIN子句中的列时,解析器知道您引用的是哪个表:
SELECT * FROM Person // child
INNER JOIN Person // parent
ON Person.ID = Person.ParentID // which table goes with which column?
或在联接中使用其他列时:
SELECT * FROM Person // child
INNER JOIN Person // parent
ON Person.ID = Person.ParentID // which table goes with which column?
AND Person.Name = "John" // child or parent?
或在WHERE子句中
SELECT * FROM Person // child
INNER JOIN Person // parent
ON Person.ID = Person.ParentID
WHERE Name = "John" // child or parent?
或者在添加第三张表时
SELECT * FROM Person // child
INNER JOIN Person // parent
ON Person.ID = Person.ParentID
INNER JOIN Address
ON Person.AddressID = Address.AddressID // child or parent?
或在结果中指定列时:
SELECT Name // Child or Parent?
FROM Person // child
INNER JOIN Person // parent
ON Person.ID = Person.ParentID // which table goes with which column?
底线 - 太多地方无法,因此需要别名。
SELECT *
FROM Person AS Child
INNER JOIN Person AS Parent
ON Parent.ID = Child.ParentID
请注意,您不是“创建[a]第二个实例”,而只是引用同一个表两次。这可能是你的意思,但我想确定你明白没有数据被复制或复制;你只是引用一张桌子。