为什么需要不同的表别名如果表在FROM子句中出现多次?

时间:2015-05-12 20:31:04

标签: sql join

目前我正在阅读一本关于SQL的书,它提供了以下解释:

  

您需要为分支表的每个实例提供不同的别名,以便服务器知道您在各个子句中引用的是哪一个。

但我无法理解为什么在使用不同的JOIN子句时,同一个表中的ON列不可能?为什么服务器需要创建表的第二个实例,然后将它们相互区分?

1 个答案:

答案 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]第二个实例”,而只是引用同一个表两次。这可能是你的意思,但我想确定你明白没有数据被复制或复制;你只是引用一张桌子。