select子句中的子查询语句的where子句

时间:2012-11-06 23:29:31

标签: sql sql-server-2008-r2

假设我有这样的查询:

   Select col1, 
          col2, 
          (select count(smthng) from table2) as 'records'
   from table1

我希望将其过滤为“记录”列不为空。

我不能这样做:

         Select col1, 
                col2, 
               (select count(smthng) from table2) as 'records'
          from table1
        where records is not null  

我想出的最好的方法是将此结果集写入Table Value参数,并对该结果集进行单独查询。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

你应该在那里做一些修改:

首先,在子查询上添加TOP子句以强制查询仅返回该table2的一条记录。像你这样的子查询应该只返回一个标量值。

其次,子查询的列列表中只能有一列,所以返回值也应该是标量列。

最后,您无法过滤select子句中的子查询或任何make列。所以我的建议是使用"join""exists"

Select col1, 
       col2
       from table1
       left outer join
            table2
       on table1.key = table2.key
       where not table2.key is null

或者这个:

Select col1, 
       col2
       from table1
       inner join
            table2
       on table1.key = table2.key

或者这个:

Select col1, 
       col2
       from table1
       where exists (
            select *
                  from table2
                  where table2.key = table1.key
                  and   not table2.somethingelse is null
                  -- or any other relevant conditions
       )

干杯