Sql 连接具有公共列的表时,要在SELECT语句中指出哪个表

Sql 连接具有公共列的表时,要在SELECT语句中指出哪个表,sql,join,sql-server-2012,Sql,Join,Sql Server 2012,我想列出从联接中选择的所有列。如果两个表中都有一列,假设我们有两个这样的列:ID作为join和Name的键,我应该写: 从t1.ID=t2.ID上的表1 t1内部联接表2 t2中选择t1.ID,t1.Name 或 从中选择t2.ID、t2.Name 或 从中选择ID、名称 或者我选择哪一张桌子根本不重要。当然,在SELECT语句中会有严格来自t1或t2的其他列,否则连接就没有意义了 对于内部连接,这并不重要。对于左外部联接,通常需要第一个表中的列;和从第二个开始的右外连接。否则,该值可能为NUL

我想列出从联接中选择的所有列。如果两个表中都有一列,假设我们有两个这样的列:ID作为join和Name的键,我应该写:

从t1.ID=t2.ID上的表1 t1内部联接表2 t2中选择t1.ID,t1.Name

从中选择t2.ID、t2.Name

从中选择ID、名称

或者我选择哪一张桌子根本不重要。当然,在SELECT语句中会有严格来自t1或t2的其他列,否则连接就没有意义了

对于内部连接,这并不重要。对于左外部联接,通常需要第一个表中的列;和从第二个开始的右外连接。否则,该值可能为NULL

我说这有点无关紧要,但是:

SELECT t1.ID, t2.Name
SELECT t2.ID, t2.Name
如果优化器决定需要从数据页中提取t1.id,可能会导致执行计划略有不同——如果查询更复杂,可能会这样。作为一般规则,我会坚持在select中引用尽可能少的表,因为这有助于优化引擎选择最佳计划

请注意,其他一些数据库支持ANSI标准using子句,该子句允许您编写:

SELECT ID, t1.Name
FROM table1 t1 INNER JOIN
     table2 t2
     USING (ID)
但是SQL Server还不支持此功能。

在SQL Server中

下面的声明将起作用

SELECT t1.ID, t1.Name FROM table1 t1 INNER JOIN table2 t2 ON t1.ID=t2.ID
下面的声明也会起作用

SELECT * FROM table1 t1 INNER JOIN table2 t2 ON t1.ID=t2.ID 
这将产生表1和表2中的所有列

下面的说法行不通

SELECT ID,NAME FROM table1 t1 INNER JOIN table2 t2 ON t1.ID=t2.ID
列不明确,sql server将不知道要投影哪些表列

最佳做法

SELECT t1.ID, t1.Name FROM table1 t1 INNER JOIN table2 t2 ON t1.ID=t2.ID

您不应该忽略表别名,这样会有同名的重复列。我通常使用第一个左表中的列,除非它是外部联接,并且我们需要这个ID,它可以为null。实际上,内部联接并不重要。