在 SQL 中连接,然后在 Left Join 中使用

Concatenate in SQL and then use in Left Join

我有以下 SQL 代码:

SELECT a.*,CONCAT(b.FirstName, " ", b.LastNameNoSuffix) AS Concatenate, b.*

  FROM [xxxx].[dbo].[xxxx] a

  Left Join [xxxx].[dbo].[xxxx] b
  on b.Concatenate= a.[display_name]

但是我收到 Invalid column name 错误

希望它很简单,但我似乎无法解决? 谢谢!

您不能在 LEFT JOIN 中使用 Concatenate,您可以像下面那样使用 SUB SELECT 或 CTE 函数

SELECT a.*,b.*
FROM [xxxx].[dbo].[xxxx] a 
LEFT JOIN (
    SELECT t.*
        ,CONCAT (
            t.FirstName
            ,' '
            ,t.lastname
            ) AS Concatenate
    FROM [xxxx].[dbo].[yyyyy] t
    ) b ON b.Concatenate = a.[display_name]

注意:如果您使用的是 SQL 服务器,请在 CONCAT 函数中使用单引号而不是双引号。

这是你可以做你需要的事情的方法:

SELECT a.*, b.*
FROM test a
join (select t2.*
             , CONCAT(t2.FirstName, ' ', t2.lastname) AS Concatenate
      from test2 t2) b on b.Concatenate = a.[display_name]

这是一个小演示:

DEMO

您不能在同一范围内重复使用 SELECT 子句中定义的别名(ORDER BY 子句分开)。您可以使用子查询(创建新范围)或重复表达式。我发现计算很简单,所以第二个解决方案就足够了:

select a.*, b.firstname + ' ' + b.lastnamenosuffix as concatenate, b.*
from a
left join b on b.firstname + ' ' b.lastnamenosuffix = a.display_name

备注:

  • 不要对文字字符串使用双引号!仅使用单引号,如标准 SQL

    中所指定
  • SQL服务器支持+字符串拼接,稍微缩短了表达式

使用 VALUES() 子句和 CROSS APPLY。它几乎是为此而设计的:

SELECT a.*, v.Concatenate, b.*
FROM [xxxx].[dbo].[xxxx] a LEFT JOIN
     ([xxxx].[dbo].[xxxx] b CROSS APPLY
      (VALUES (CONCAT(b.FirstName, ' ', b.LastNameNoSuffix))
      ) v(concatenate)
     ) 
     ON v.Concatenate = a.[display_name]