Sql 有没有一种方法可以使用“连接”来连接表;作为「;列名

Sql 有没有一种方法可以使用“连接”来连接表;作为「;列名,sql,sql-server,join,matching,spaces,Sql,Sql Server,Join,Matching,Spaces,我正在尝试创建一个查询,根据名字和姓氏将两个表连接在一起。我成功地获得子字符串,将一列中的名称拆分为两个名为FirstName和LastName的列。这是为了让我匹配这些列,这样他们就可以得到正确的分机号码、电话号码、部门和姓名。然而,我在这里做错了什么。我这样做的方法不起作用,否则会出错 SELECT SUBSTRING(Users.Names, CHARINDEX(' ', Users.Names + ' ') + 1, 8000)AS LastName, SUBSTRING(Users.N

我正在尝试创建一个查询,根据名字和姓氏将两个表连接在一起。我成功地获得子字符串,将一列中的名称拆分为两个名为FirstName和LastName的列。这是为了让我匹配这些列,这样他们就可以得到正确的分机号码、电话号码、部门和姓名。然而,我在这里做错了什么。我这样做的方法不起作用,否则会出错

SELECT SUBSTRING(Users.Names, CHARINDEX(' ', Users.Names + ' ') + 1, 8000)AS LastName, SUBSTRING(Users.Names, 1, CHARINDEX(' ', Users.Names) - 1) AS FirstName,Users.Extension, GA.[First], GA.[Last], GA.Department, GA.Phone, GA.Mobile
FROM GlobalAddress AS GA 
    Left Join Users ON GA.[First] = substring(Users.Names,1,charindex(' ',Users.Names) ) AND SUBSTRING(Users.Names, CHARINDEX(' ', Users.Names + ' ') + 1, 8000) = Ga.[Last]
WHERE GA.[Last] IS NOT NULL
ORDER BY Users.Extension
我的想法是,我可以用以下方法替换左连接:

Users ON GA.[First] = FirstName AND Ga.[Last] = LastName
但这是一个错误。列名“FirstName”无效

任何帮助都将不胜感激

编辑:

编辑2:


在连接时使用原始值-而不是别名

...Users ON GA.[First] = SUBSTRING(Users.Names, 1, CHARINDEX(' ', Users.Names) - 1)  ...

因此,您需要为列创建别名,因为它们的长主体出现在许多地方。交叉应用可以做到这一点:

SELECT
    q.LastName,
    q.FirstName,
    Users.Extension, GA.[First], GA.[Last], GA.Department, GA.Phone, GA.Mobile
FROM 
Users
cross apply (select
    SUBSTRING(Users.Names, CHARINDEX(' ', Users.Names + ' ') + 1, 8000)AS LastName,
    left(Users.Names, CHARINDEX(' ', Users.Names + ' ') - 1) AS FirstName
    )q
Right Join GlobalAddress AS GA 
    ON GA.[First] = q.FirstName 
    AND q.LastName = Ga.[Last]
WHERE GA.[Last] IS NOT NULL ORDER BY Users.Extension

当交叉应用程序中没有FROM时,可以将其视为为为其列创建别名。

Wow。这可能是我第一次认为,
右连接
是一种更简单的方法:

SELECT v.LastName, v.FirstName, u.Extension, GA.[First], GA.[Last],
       GA.Department, GA.Phone, GA.Mobile
from Users u cross apply
     (values (substring(u.Names, CHARINDEX(' ', u.Names + ' ') + 1, 8000),
              left(u.Names, CHARINDEX(' ', u.Names + ' ') - 1)
             )
     ) v(LastName, Firstname) right join
     GlobalAddress GA
     on GA.[First] = v.firstname and
        Ga.[Last] = v.lastname
where GA.[Last] is not null
order by u.Extension;

我不知道你是否真的想要一个外部连接。请注意,您可以使用
左连接和括号来完成此操作。

不需要像这样的别名表:“GlobalAddress GA”,如果您给我们提供具有相同结构的GlobalAddress和Users表的示例,以及一些数据,它将帮助我们甚至提供更好的方法。因为你可能会错过一些你的帖子中没有提到的东西@iSR5我添加了我从中提取的数据的片段。对于姓氏,相同。传递给子字符串函数的长度参数无效。我现在遇到了这个错误您最初的查询中到底有什么错误?你期望的结果是什么?您正在处理的示例数据是什么?我进行了编辑以显示我的数据和问题的图像,我遇到了此错误。Msg 4104,级别16,状态1,第1行无法绑定多部分标识符“Users.Names”。我能做些什么来解决这个问题呢?再试一次,我把Users表放在第一位,这样cross-apply就可以绘制它的data@GeorgeMenoutis . . . 我打算编辑您的原始答案,添加对
values()
的提及,而不是
select
。但是,我发现您的查询在语法上不正确,因为引用了
用户
,所以我想我需要提供另一个答案。做得好,我有点容易受到这些语法错误的影响。传递给SUBSTRING函数的长度参数无效。这就是给我的错误。我以前用过它的原名。我相信它不喜欢…Users.Names中的-1)作为firstname我的答案看起来像Linoff的,我很高兴:)关键字“values”附近的语法不正确。非常感谢你的帮助。目前这给了我一个错误。我想发件人不喜欢我的……u.Names+“”)-1)。我以前犯过这个错误,我想是-1.hm,我想Gordon忘了把左()括在()中,或者我不明白你说的@GeorgeMenoutis是什么意思,或者把左()括起来对meScratch不起作用,用8000)代替8000)(