Sql Where子句中的子查询问题

Sql Where子句中的子查询问题,sql,sql-server,Sql,Sql Server,我有一个选择查询: Select left([Foundation_Account_Name],4) From [dbo].[tbl_Foundation_Account] Where [Foundation_Account_Name] 返回 MAZA SUMI APLH 我有第二个Select查询,它从临时表中选择相同的字段 Select left([Foundation Account Name],4) From [dbo]

我有一个选择查询:

Select  left([Foundation_Account_Name],4)
     From [dbo].[tbl_Foundation_Account]    
        Where [Foundation_Account_Name] 
返回

MAZA
SUMI
APLH
我有第二个Select查询,它从临时表中选择相同的字段

Select left([Foundation Account Name],4) 
            From [dbo].[Import_tbl_RDO]
                 Where [Foundation Account Name] IS NOT NULL))
返回

SUMI
我想在where子句中使用这些select查询,当我在
tbl\u Foundation\u帐户上运行select时,它将只返回
SUMI
。我的想法是

Select  left([Foundation_Account_Name],4)
     From [dbo].[tbl_Foundation_Account]    
        Where [Foundation_Account_Name] = (Select  left([Foundation_Account_Name],4)
     From [dbo].[tbl_Foundation_Account]    
        Where [Foundation_Account_Name] = (Select left([Foundation Account Name],4) 
            From [dbo].[Import_tbl_RDO]
                 Where [Foundation Account Name] IS NOT NULL))

理论上(至少在我看来),主选择查询只会从
tbl\u Foundation\u Account
中选择记录,其中第二个和第三个选择查询彼此相等,应该是
SUMI
。现在,这一切都没有回报,而我在兔子洞里越陷越深,我就越感到困惑。这是一个混乱的查询,还是我已经接近达到我想要的结果了

您可以使用
intersect
从这两个查询中获得共同的结果

Select left([Foundation_Account_Name],4)
From [dbo].[tbl_Foundation_Account]    
INTERSECT 
Select left([Foundation Account Name],4) 
From [dbo].[Import_tbl_RDO]
Where [Foundation Account Name] IS NOT NULL

就在你已经拥有的基础上。。。把桌子连在一起。。。 虽然intersect看起来更干净

with A as (SELECT left([Foundation_Account_Name],4) ID
           FROM [dbo].[tbl_Foundation_Account]), 
     b as (SELECT left([Foundation Account Name],4) ID
           FROM [dbo].[Import_tbl_RDO])

SELECT C.left([Foundation_Account_Name],4) 
FROM [dbo].[tbl_Foundation_Account]  C
INNER JOIN A on A.ID = C.left([Foundation_Account_Name],4)
INNER JOIN B on A.ID = B.ID

你真正想做的事情大致如下:

SELECT {{FIELDS TO QUERY}}
FROM [dbo].[tbl_Foundation_Account] fa    
WHERE EXISTS (
    SELECT *
    FROM [dbo].[Import_tbl_RDO] rdo
    WHERE left(rbo.[Foundation Account Name],4) = left(fa.[Foundation Account Name],4)
)
或者,如果需要从
Import\u tbl\u RDO
访问任何数据,也可以简单地联接表:

SELECT {{FIELDS TO QUERY}}
FROM [dbo].[tbl_Foundation_Account] fa    
INNER JOIN [dbo].[Import_tbl_RDO] rdo
    ON left(rbo.[Foundation Account Name],4) = left(fa.[Foundation Account Name],4)

第二种方法的“缺点”是,如果您有多个符合条件的
Import\u tbl\u RDO
行,您将得到重复的行(可能需要,也可能不需要)。

您的问题没有完全意义,因为如果您真正想要的结果是temp表上的查询返回的结果,那么为什么不直接使用它呢

我想你真正想要的是根据你对临时表的查询结果,过滤返回更多列的查询结果。如果临时表查询保证每次只返回一行,那么您可以这样编写:

Select 
  -- column1, column2, ...
From [dbo].[tbl_Foundation_Account]    
Where left([Foundation Account Name],4) = (
    Select left([Foundation Account Name],4) 
    From [dbo].[Import_tbl_RDO]
    Where [Foundation Account Name] IS NOT NULL
  )
不过,更可能的是,在某些情况下,临时表查询可以返回多行,或者可能不返回任何行。在这种情况下,您可能需要处于
状态的

Select 
  -- column1, column2, ...
From [dbo].[tbl_Foundation_Account]    
Where left([Foundation Account Name],4) IN (
    Select left([Foundation Account Name],4) 
    From [dbo].[Import_tbl_RDO]
    Where [Foundation Account Name] IS NOT NULL
  )

你为什么需要b桌?如果删除所有与之相关的符号,你的查询不是工作得很好吗?我想你的意思是为什么我需要A。A和c是一样的。你是对的,我真的不需要A或A相交B连接。我没有看表名,我假设所有3个表名都不同。我完全是指b,因为您需要将
内部联接A保留在A.ID=C.left([Foundation\u Account\u Name],4)
行上,除此之外,A和b是相同的。