Sql server T-SQL在向现有查询添加新的自连接时,是否有任何功能可以避免不明确的列名

Sql server T-SQL在向现有查询添加新的自连接时,是否有任何功能可以避免不明确的列名,sql-server,tsql,join,self-reference,ambiguity,Sql Server,Tsql,Join,Self Reference,Ambiguity,假设我们有一个来自2个表的复杂多行查询 A(pkA、a1、a2) B(pkB、fkA、b1、b2) 我们有一个查询,没有为列添加表前缀: select pkA, a1, a2, b1, bb2,.... from A inner join B on pkA = fkA where a1 = 1 and a2 = 2 order by a1 现在我们要将自引用列fkSelfA添加到表A中,然后我们要将自引用联接更改为查询,查询应全部更改为: select A.pkA, A.a1, A.a2

假设我们有一个来自2个表的复杂多行查询

  • A(pkA、a1、a2)
  • B(pkB、fkA、b1、b2)
我们有一个查询,没有为列添加表前缀:

select pkA, a1, a2, b1, bb2,....
from A 
inner join B on pkA = fkA
where a1 = 1 and a2 = 2
order by a1
现在我们要将自引用列fkSelfA添加到表A中,然后我们要将自引用联接更改为查询,查询应全部更改为:

select A.pkA, A.a1, A.a2, b1, bb2, SelfA.A1 as SelfA1
from A 
inner join B on pkA = fkA
left join A SelfA on SelfA.pkA = A.fkSelfA
where A.a1 = 1 and A.a2 = 2
order by A.a1
正如我们所看到的,我们必须更改所有查询,并将“A”添加到使用表A列的所有地方

我想知道是否存在或将存在忽略联接中表的列名的功能,以便我们可以轻松添加联接,而不必担心不明确的列名。例如:

select pkA,a1,a2,b1,bb2,SelfA.A1 as SelfA1
from A inner join B ON pkA=fkA
LEFT JOIN Ignore A SelfA ON SelfA.pkA=A.fkSelfA
where a1=1 and a2=2
order by a1

你可以这样做:

SELECT pkA, a1, a2, b1, bb2, SelfA1
FROM A INNER JOIN B ON pkA=fkA
OUTER APPLY (
    SELECT SelfA.A1 AS SelfA1
    FROM A SelfA
    WHERE SelfA.pkA=A.fkSelfA
) X
WHERE a1=1 AND a2=2
ORDER BY a1

但是,最好在所有列前面加上表别名。为了帮助您实现这一点,您可以使用这样的工具。

嗯,您可以这样做:

SELECT pkA, a1, a2, b1, bb2, SelfA1
FROM A INNER JOIN B ON pkA=fkA
OUTER APPLY (
    SELECT SelfA.A1 AS SelfA1
    FROM A SelfA
    WHERE SelfA.pkA=A.fkSelfA
) X
WHERE a1=1 AND a2=2
ORDER BY a1

但是,最好在所有列前面加上表别名。为了帮助您做到这一点,您可以使用这样的工具。

简短回答:否。不再回答:否,如果它鼓励人们在以前没有的列名前加前缀,这是一件好事。当有人添加一个列时,今天明确的列可能是明天的名称冲突。对于一个数据库来说,最糟糕的事情就是使它不能适应新列的添加,因为这是您希望向前兼容的最基本的事情。如果
B
获得
a2
列,您的原始查询将中断。这是完全正确的,但我指的是不带前缀地修改旧项目的现有查询。如果您能够/需要修改它们,请花时间正确地进行修改。向当前不含糊的查询添加前缀是一种简单的、非侵入性的操作,对于一个没有机会破坏它的查询来说。像数据库项目这样的工具具有自动完成功能,可以帮助实现这一点。如果你坚持不使用前缀,你必须做一些丑陋的事情,比如引入显式重命名列的视图。谢谢Jeroen,我觉得你是负责向T-SQL添加功能的程序员,因为你非常反对添加功能;)建议的功能可以解决很多问题,不仅仅是我的场景如果你想建议一个新功能,你可以这样做。你会很高兴知道我实际上并没有参与到什么样的特征的决策过程中……简短的回答:不。更长的答案:不,这是一件好事,如果它鼓励人们前缀他们的列名,他们以前没有。当有人添加一个列时,今天明确的列可能是明天的名称冲突。对于一个数据库来说,最糟糕的事情就是使它不能适应新列的添加,因为这是您希望向前兼容的最基本的事情。如果
B
获得
a2
列,您的原始查询将中断。这是完全正确的,但我指的是不带前缀地修改旧项目的现有查询。如果您能够/需要修改它们,请花时间正确地进行修改。向当前不含糊的查询添加前缀是一种简单的、非侵入性的操作,对于一个没有机会破坏它的查询来说。像数据库项目这样的工具具有自动完成功能,可以帮助实现这一点。如果你坚持不使用前缀,你必须做一些丑陋的事情,比如引入显式重命名列的视图。谢谢Jeroen,我觉得你是负责向T-SQL添加功能的程序员,因为你非常反对添加功能;)建议的功能可以解决很多问题,不仅仅是我的场景如果你想建议一个新功能,你可以这样做。你会很高兴知道我实际上并没有参与到什么样的特征的决策过程中去考虑…