TSQL语法-带引号前缀的别名是否已消除?

TSQL语法-带引号前缀的别名是否已消除?,tsql,Tsql,有人能告诉我,用以下tsql语法编写查询是MSFT目前不赞成的,还是很快就会反对的,还是与我不知道的某些最佳实践相反的2 SELECT 'CustName' = (SELECT Lastname + ', ' + Firstname FROM Cust WHERE CustID = O.CustID), 'ProdName' = (SELECT ProductName FROM Product WHERE ProductID = O.ProductID) FROM Orders O 具体的问

有人能告诉我,用以下tsql语法编写查询是MSFT目前不赞成的,还是很快就会反对的,还是与我不知道的某些最佳实践相反的2

SELECT 
'CustName' = (SELECT Lastname + ', ' + Firstname FROM Cust WHERE CustID = O.CustID),
'ProdName' = (SELECT ProductName FROM Product WHERE ProductID = O.ProductID)
FROM Orders O
具体的问题是将新列名一直放在行的前面或左边,而不是写子查询并将新列名放在子查询后面的方括号中。显然这两种方法都可以,但是当DBA查看我的数据库代码时,他们通常会给我一个WTF外观,尽管我告诉他们它更可读,因为您的所有列名都在左边

以这种方式编写查询是否有问题

澄清:重点不是SELECT语句中的子查询,而是语法是否:

'NewColumnName' = OldColumnName

很快就要走了。我选择用一对子查询来演示这个问题,而不是使用我正在使用的生产代码中的巨大而深奥的自定义函数调用和case语句

我通常在使用子查询设置变量时看到这种语法,例如@MyValue=subquery。所以有一分钟我也发了一点WTF。然而,我明白你的观点,总的来说,我无法想象这是一个在未来不会被支持的东西

就我个人而言,我更喜欢格式化的方式,以及清晰的定义。我会这样写

SELECT 
    (SELECT Lastname + ', ' + Firstname 
     FROM Cust 
     WHERE CustID = O.CustID
    ) AS CustName,
    (SELECT ProductName 
     FROM Product 
     WHERE ProductID = O.ProductID
    ) AS ProdName
FROM Orders O

我个人觉得这更容易阅读…但很可能只是我…

您以一种奇怪、不熟悉的方式给列名加了别名。我必须运行它,看看它是否有效

做人们期望的事,而不是做奇怪和不寻常的事:

SELECT 
   (SELECT Lastname + ', ' + Firstname FROM Cust WHERE CustID = O.CustID) AS CustName,
   (SELECT ProductName FROM Product WHERE ProductID = O.ProductID) AS ProdName
FROM Orders O

这辆车绝对没有问题

column alias = expression
语法,它不会被认为是不赞成很快或坏的做法

查询的主要问题是,您应该使用联接将Orders表连接到Cust表和Product表。这个查询看起来像是假设每个订单只有一个客户和一个产品——想想如果不是这样会发生什么

SELECT 
     'CustName' = C.Lastname + ', ' + C.Firstname,
     'ProdName' = P.ProductName 
FROM Orders O 
JOIN Cust C on C.CustID = O.CustID 
JOIN Product P on P.ProductID= O.ProductID

我猜人们会对此犹豫不决,因为它是特定于MSSQL的,至少其他系统不支持它,而不是我现在可以使用的系统。这就像听一种不熟悉的方言——你可以看到对方在说什么,但你看不出他们究竟为什么会选择那样说话。

根据SQL2005BOL-here-ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/instsql9/html/c10eeaa5-3d3c-49b4-a4bd-5dc4fb190142.htm 这里:在2008年的文档中这里:查看Transact-SQL功能下,这将在未来的版本中被弃用

然而,这有点微妙。此弃用警告实际上仅适用于在此上下文中使用引号,而不适用于列别名第一格式。也就是说,这将被弃用:

'AliasName' = NewValue 
但是,这仍然有效,甚至被列为它的替代品:

AliasName = NewValue

因此,只要去掉撇号就可以了。

WTF是来自命名约定还是select子句中的子查询?是将新列名放在行的前面,而不是放在方括号中的行的末尾。我通常不会以所示的方式使用子查询。。。这只是一个重命名结构的简单示例……而且,作为记录,按照您在其中编写子查询的方式编写子查询并没有什么错。只要您不复制其中的表引用,2005年及更高版本的优化器就会将它们转换为连接等价物。单引号的意义何在?我一直使用colName=1。我更喜欢它作为colName,但决不使用单引号。RBarryYoung,这是一个相关子查询,即使在SQL Server 2008中,它也会慢得多,因为它必须逐个记录而不是以一种固定的方式进行计算。写一个双向的示例,检查执行计划,您将看到。实际上,永远不应该使用相关子查询来代替连接,它有时可能需要连接到派生表,特别是在生产环境中。我已经键入了基本相同的内容,但你抢先了我一步。在我看来,WTF是select子句中的子查询。我的问题与数据的获取方式无关,而是与别名语法有关。作为一个SQL的流利演讲者,我看不出Linq2Sql的意义所在,因为同样的原因,尽管Linq2*看起来非常有用……可以肯定,这是一个简单的例子;实际的生产案例在SELECT语句中大约有30列,我发现将列名(新的或原始的名称)一直放在编辑器的同一列中以增加可读性。WTF仅在有人在复杂的mnay行CASE语句中查找列行末尾的列名时出现,而不是在开头。