【问题标题】:Concatenate in SQL and then use in Left Join在 SQL 中连接,然后在左连接中使用
【发布时间】:2020-11-26 10:37:59
【问题描述】:

我有以下 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 错误

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

【问题讨论】:

  • 在连接中使用 concat,而不是别名 - 在处理连接之前它不会解析别名!
  • Logical processing order of the SELECT statement: “因为 SELECT 子句是第 8 步,所以该子句中定义的任何列别名或派生列都不能被前面的子句引用”(JOIN 是第 3 步)
  • 对字符串文字使用单引号,例如' '。 (双引号用于分隔标识符,因此" " 是此处的列名。)
  • 如果您确实需要加入一个名称,并且在一个表中将它们分开而另一个则没有,那么您可能还需要考虑设计。将名称存储在其单独的部分中始终是可行的方法,但您始终可以将 (PERSISTED) 计算列添加到连接它们的表中,以便于使用。将该列添加到别名为 b 的表中,您可以轻松地将 JOIN 添加到表 a 中。
  • 从经验来看,一个名字是一个糟糕的JOIN候选人/标识符。曾经有人住在离我几扇门的地方,他们的名字和DoB都一样,因为我们住在附近,地址非常相似。我当地的医生和牙医总是要花点时间才能弄清楚他们在和我们谁说话。

标签: sql sql-server string subquery left-join


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您不能在 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 Server,请在 CONCAT 函数中使用单引号而不是双引号。

    【讨论】:

      【解决方案3】:

      您不能在同一范围内重用 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 Server 支持+ 进行字符串连接,这会稍微缩短表达式

      【讨论】:

        【解决方案4】:

        使用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]
        

        【讨论】:

          猜你喜欢
          • 2018-09-05
          • 1970-01-01
          • 1970-01-01
          • 2017-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-18
          相关资源
          最近更新 更多