Sql 在select子句中与子查询左连接并访问主表列

Sql 在select子句中与子查询左连接并访问主表列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个insert语句,如下所示,它获取的sytax错误是“无法绑定多部分标识符”t2.Col1。”。我过度简化了声明,如下所示: INSERT INTO dbo.T1 ( Col1, Col2, Col3 ) SELECT t2.Col1, SUBSTRING(aCase.CaseColumn, 0, CHARINDEX('%', aCase.CaseColumn)), --I expect this line gets the value "2"

我有一个insert语句,如下所示,它获取的sytax错误是“无法绑定多部分标识符”t2.Col1。”。我过度简化了声明,如下所示:

INSERT INTO dbo.T1
(
    Col1,
    Col2,
    Col3
)
SELECT 
    t2.Col1,
    SUBSTRING(aCase.CaseColumn, 0, CHARINDEX('%', aCase.CaseColumn)), --I expect this line gets the value "2"
    SUBSTRING(aCase.CaseColumn, CHARINDEX('%', aCase.CaseColumn) + 1, LEN(aCase.CaseColumn) - CHARINDEX('%', aCase.CaseColumn)) --I expect this line gets the value "3"
FROM 
    dbo.T2 t2
LEFT JOIN 
(
    SELECT 
        CASE --I have hundreds of WHEN conditions below and need to access the parent T2 tables' properties
            WHEN t2.Col1 = 1 THEN '2%3' --This line has a syntax error of "the multi-part identifier "t2.Col1" could not be bound."
        END AS CaseColumn
) 
AS aCase ON 1 = 1 

我之所以将
左连接
大小写
一起使用,是因为我有数百个条件,需要为不同的列选择不同的值。我不想对所有列重复相同的
CASE
语句。因此,我使用一个单独的
大小写
,将值与分隔符连接起来,然后解析连接的字符串并将适当的值放在适当的位置。

您可以使用
外部应用
,因为它允许您的
dbo.T2
aCase
结果集相关,如下所示:

INSERT INTO dbo.T1
(
    Col1,
    Col2,
    Col3
)
SELECT 
    1,
    SUBSTRING(aCase.CaseColumn, 0, CHARINDEX('%', aCase.CaseColumn)), --I expect this line gets the value "2"
    SUBSTRING(aCase.CaseColumn, CHARINDEX('%', aCase.CaseColumn) + 1, LEN(aCase.CaseColumn) - CHARINDEX('%', aCase.CaseColumn)) --I expect this line gets the value "3"
FROM 
    dbo.T2 t2
OUTER APPLY
(
    SELECT 
        CASE --I have hundreds of WHEN conditions below and need to access the parent T2 tables' properties
            WHEN t2.Col1 = 1 THEN '2%3' 
        END AS CaseColumn
) 
AS aCase ON 1 = 1 
这是因为子查询的结果本身不是独立的,它必须基于dbo.T2表的值来定义

阅读有关
外部应用
交叉应用
的更多信息


第三,“重用表别名”与您的情况类似,链接到它的文章完美地解释了如何在这些情况下使用
交叉应用/outer应用

当使用子查询的联接时,在该子查询中它不知道t2是什么,除非您从该子查询中别名为t2的表中进行选择。
您可以将左连接更改为外部应用

但在这种情况下,您实际上不需要加入或应用

只需从T2中选择子查询中的大小写即可。

请注意大小写和子字符串是如何稍微改变的


顺便说一句,我个人只需要将不同的Col1插入T1,然后手动更新引用表中的Col2和Col3。这可能比写下那几百个条件要快。但是,您确实说过这简化了很多。

为什么不将整个表查询移动到联接中,然后从中进行选择?因为在主查询中根本不使用T2,所以它不需要在那里,并且简化了事情。实际上使用了T2,但我没有将其放在那里,使它看起来更简单。检查my editOk,然后您可以从连接的select中选择这些列,并从中使用它们,因为它们之间似乎是行对行映射。好像已经有人建议你回答你错过了我上次的编辑。我编辑了我选择1至->t2的零件。Col1@sotn事实上,我错过了那一次。我想知道为什么要插入一个固定的数字。固定的。
INSERT INTO dbo.T1
(
    Col1,
    Col2,
    Col3
)
SELECT 
    Col1,
    SUBSTRING(CaseColumn, 1, CHARINDEX('%', CaseColumn)-1),
    SUBSTRING(CaseColumn, CHARINDEX('%',CaseColumn)+1, LEN(CaseColumn))
FROM 
(
  SELECT 
   Col1,
   CASE Col1
    WHEN 1 THEN '2%3'
    -- more when's
   END AS CaseColumn
  FROM dbo.T2 t2
) q