13

假设我有这样的查询:

   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  

我想出的最好的方法是将此结果集写入表值参数并对该结果集进行单独的查询。有任何想法吗?

4

2 回答 2

18

只需将其移至派生查询即可。您不能在 WHERE 子句中使用 SELECT 子句中定义的列。

Select col1, col2, records
from
(
    Select col1, 
           col2, 
           (select ..... from table2) as records
    from table1
) X
where records is not null;
于 2012-11-06T23:45:22.020 回答
3

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

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

其次,子查询在其列列表中只能有一列,因此返回值应该是一个标量。

最后,您无法在选择子句中过滤子查询或任何已生成的列。所以我的建议是使用"join"s 或"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
       )

干杯

于 2012-11-06T23:41:59.230 回答