如何使用创建的列作为 SQL 查询的 JOIN 参数

SOK*_*SOK 9 sql sql-server

我有 3 个数据表,我正在尝试加入 ( TEXTDATA, STOREDATA, SALESDATA)。我的 TEXTDATA 在其中一个列中有一个名称字符串,因此创建了一个子字符串来查找它。

然后我尝试使用新形成的字符串 ( name) 作为连接到 SALESDATA 表的基础。

这是我的代码

SELECT b.*,
       a.text,
       a.textname,
       SUBSTRING(a.[textname], CHARINDEX('/ ', a.[textname]) + 1, 11) AS NAME,
       c.[Sales],
       c.[Customer],
       c.[Class]
FROM   [dbo].[TEXTDATA] a
       INNER JOIN [dbo].[STOREDATA] b
            ON  a.[ID_TEXTDATA] = b.[ID_STOREDATA]
       LEFT JOIN [dbo].[SALESDATA] c
            ON  NAME = c.FirstName
Run Code Online (Sandbox Code Playgroud)

错误说Invalid column name 'name'

关于如何引用稍后在查询中创建的新列有什么想法吗?

非常感谢!

Max*_*rek 8

最简单的选择就是在 LEFT JOIN 的 ON 子句中使用相同的公式:

LEFT JOIN [dbo].[SALESDATA] c
    ON SUBSTRING(a.[textname],CHARINDEX('/ ',a.[textname])+1,11) = c.FirstName
Run Code Online (Sandbox Code Playgroud)

或者您可以将公式放入 TEXTDATA 表的 CTE 抽象中:

;with cte AS (
    SELECT [ID_TEXTDATA], text, textname, SUBSTRING(a.[textname],CHARINDEX('/ ',a.[textname])+1,11) as name
    From [dbo].[TEXTDATA] a 
)
SELECT b.*
,cte.text
,cte.textname
,cte.name
,c.[Sales]
,c.[Customer]
,c.[Class]
From 
    cte
INNER JOIN [dbo].[STOREDATA] b 
    on  cte.[ID_TEXTDATA] = b.[ID_STOREDATA]
LEFT JOIN [dbo].[SALESDATA] c
    on cte.name = c.FirstName
Run Code Online (Sandbox Code Playgroud)