子查询SQL Server中的条件

时间:2019-08-15 11:35:46

标签: sql sql-server

在使用子查询时,我对where条件参数有一些疑问。

select 
    id, name, 
    (select count(*) from table2) count 
from 
    table1

输出为

+----+-------------+-------+
| id | name        | count |
+----+-------------+-------+
|  1 | abc         |    13 |
|  2 | efg         |    15 |
+----+-------------+-------+

我想在这种情况下使用此计数:

select 
    id, name, 
    (select count(*) from table2) count 
from 
    table1 
where 
    count = 15

但是我得到这个错误:

  

错误1054(42S22):“ where子句”中的未知列“ count”

我不想在where子句中使用整个子查询。我们如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

使用派生表:

select * from
(
    select id,name, (select count(*) from table2) count from table1
) dt
where count = 15

答案 1 :(得分:2)

此查询:

select id,name, (select count(*) from table2) as count
from table1

不会返回您指定的结果。我怎么知道?两行中的计数不同。如果这是查询,则计数将相同。

对于给定的查询,显而易见的解决方案是将子查询移至from子句:

select t1.id, t1.name, t2.cnt
from table1 t1 cross join
     (select count(*) as cnt from table2 t2) t2
where t2.cnt = 15;

但是,您的查询可能是相关子查询。在那种情况下,最好的解决方案是使用apply(也可以用于不相关的情况):

select t1.id, t1.name, t2.cnt
from table1 t1 outer apply
     (select count(*) as cnt
      from table2 t2
     ) t2
where t2.cnt = 15;