Конкатенация в SQL, а затем использование в левом соединении

#sql #sql-server #string #subquery #left-join

#sql #sql-сервер #строка #подзапрос #левое соединение

Вопрос:

У меня есть следующий код 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 сообщение об ошибке

Надеюсь, это что-то простое, но я, похоже, не могу с этим справиться? Спасибо!

Комментарии:

1. Используйте concat в соединении, а не псевдонимное имя — оно не разрешит псевдоним, пока соединение не будет обработано!

2. Логический порядок обработки инструкции SELECT : «поскольку предложение SELECT является шагом 8, на любые псевдонимы столбцов или производные столбцы, определенные в этом предложении, не могут ссылаться предыдущие предложения» ( JOIN шаг 3)

3. Используйте одинарные кавычки для строковых литералов, например ' ' . (Двойные кавычки предназначены для идентификаторов с разделителями, поэтому " " здесь указано имя столбца.)

4. Если вам нужно объединить имя, и в одной таблице оно разделяет их, а в другой — нет, то вы, вероятно, захотите также рассмотреть дизайн. Сохранение имени в отдельных частях — это всегда правильный путь, но вы всегда можете добавить PERSISTED вычисляемый столбец () в таблицу, который также объединяет их для удобства. Добавление этого столбца в вашу таблицу с псевдонимами b позволит вам JOIN тривиально использовать таблицу a .

5. Однако, исходя из опыта, имя является плохим 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]
 

И вот небольшая демонстрация:

ДЕМОНСТРАЦИЯ

Ответ №2:

Вы не можете использовать конкатенацию в своем LEFT JOIN , вы можете сделать это следующим образом, используя вспомогательный ВЫБОР или 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]