当未使用EXISTS引入子查询时,只能在选择列表中指定一个表达式。在子查询sqlserver中

时间:2017-11-30 11:35:59

标签: sql sql-server subquery

我想在我的数据库中执行这个查询。你可以看到表A和B都有一对多的关系,但我需要B.so中的最新记录我这里是我的查询:

select *,(select top 1 ResultTest ,ResultState2 from B where GasReceptionId=A.Id order by Id desc) 
from A where OrganizationGasId= 4212

但是我得到了这个错误

Msg 116, Level 16, State 1, Line 2
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.

2 个答案:

答案 0 :(得分:1)

您可以将此查询重新定义为基本联接,它使用分析函数(例如行号)来识别来自B的正确行数据,以包含来自{{1}的每条记录} table。

A

答案 1 :(得分:1)

SELECT子句中的子查询必须只返回一列(以及一行或零行)。所以你可以有两个子查询:

select 
  a.*,
  (select top 1 resulttest from b where gasreceptionid = a.id order by id desc) as test,
  (select top 1 resultstate2 from b where gasreceptionid = a.id order by id desc) as state
from a 
where a.organizationgasid = 4212;

或者,更好的是,将子查询移动到FROM子句。一种方法是OUTER APPLY

select 
  a.*, r.resulttest, r.resultstate2
from a 
outer apply
(
  select top 1 resulttest, resultstate2
  from b 
  where gasreceptionid = a.id 
  order by id desc
) r
where a.organizationgasid = 4212;