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是相同的。