#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]