子句点在Where子句中的问题

时间:2015-10-13 20:23:06

标签: 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].[Import_tbl_RDO]
                 Where [Foundation Account Name] IS NOT NULL))

返回

SUMI

我想在where子句中使用这些select查询,当我在SUMI上运行select时,它只返回tbl_Foundation_Account。我的想法就是这个,

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_Foundation_Account中选择记录,其中第二个和第三个选择查询彼此相等,应该是SUMI。现在,这只是什么都没有回来,我得到的兔子洞越深,我就越迷茫。这个查询是搞砸了,还是我接近实现我想要的结果

4 个答案:

答案 0 :(得分:0)

您可以使用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

答案 1 :(得分:0)

只是建立你已经拥有的东西......并将桌子加在一起...... 虽然相交似乎更清洁......

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

答案 2 :(得分:0)

你真正想要做的是:

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_tbl_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_tbl_RDO行,您最终会得到重复的行(可能需要也可能不需要)。

答案 3 :(得分:0)

你的问题并没有完全像提出的那样有意义,因为如果你真正想要的结果是临时表上的查询返回的内容,那你为什么不直接使用它呢?

我认为你真正想要的是过滤查询结果,根据你对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
  )

但更可能的情况是,在某些情况下,临时表查询可以返回多行,或者可能没有。在这种情况下,您可能需要IN条件:

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
  )