Sql 多个select语句,但列数不同
我正在尝试选择一个职位,然后选择它旁边的报告行 我的问题是:Sql 多个select语句,但列数不同,sql,sql-server,sql-server-2008-r2,sql-server-2012,Sql,Sql Server,Sql Server 2008 R2,Sql Server 2012,我正在尝试选择一个职位,然后选择它旁边的报告行 我的问题是: SELECT (SELECT pos.PositionId FROM PositionData pos WHERE pos.PositionId = 1234) as [Topmost], (SELECT pos.PositionId FROM PositionData pos WHERE pos.pdOpsReportLine = 1234) as [Reportline] 我得到的错误是: Msg 512, Level 16,
SELECT (SELECT pos.PositionId
FROM PositionData pos
WHERE pos.PositionId = 1234) as [Topmost],
(SELECT pos.PositionId
FROM PositionData pos
WHERE pos.pdOpsReportLine = 1234) as [Reportline]
我得到的错误是:
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
我不想要的是:
Topmost Reportline
1234 2345
3456
4567
5678
Topmost
1234
2345
3456
4567
5678
其中,topmost是最优秀的员工,如首席执行官,reportline是向他报告的人。尝试以下方法:
Declare @Topmost int=1234,
@MinPositionId int
SELECT @MinPositionId=min(pos.PositionId)
FROM PositionData pos
WHERE pos.pdOpsReportLine = @Topmost
select @Topmost Topmost,@MinPositionId Reportline
Union all
SELECT '',pos.PositionId
FROM PositionData pos
WHERE pos.pdOpsReportLine = @Topmost
and pos.PositionId != @MinPositionId
试试这个:
Declare @Topmost int=1234,
@MinPositionId int
SELECT @MinPositionId=min(pos.PositionId)
FROM PositionData pos
WHERE pos.pdOpsReportLine = @Topmost
select @Topmost Topmost,@MinPositionId Reportline
Union all
SELECT '',pos.PositionId
FROM PositionData pos
WHERE pos.pdOpsReportLine = @Topmost
and pos.PositionId != @MinPositionId
如果要以这种格式获取所有数据,可以执行以下操作:
select
case
when row_number() over(partition by pos.PositionId order by pos1.pdOpsReportLine) = 1 then
pos.PositionId
else
null
end as [Topmost],
pos1.PositionId as [Reportline]
from PositionData as pos
left outer join PositionData pos1 on pos.PositionId = pos1.pdOpsReportLine
where pos.pdOpsReportLine is null
order by pos.PositionId, pos1.pdOpsReportLine
请参见示例如果希望以这种格式获取所有数据,可以执行以下操作:
select
case
when row_number() over(partition by pos.PositionId order by pos1.pdOpsReportLine) = 1 then
pos.PositionId
else
null
end as [Topmost],
pos1.PositionId as [Reportline]
from PositionData as pos
left outer join PositionData pos1 on pos.PositionId = pos1.pdOpsReportLine
where pos.pdOpsReportLine is null
order by pos.PositionId, pos1.pdOpsReportLine
请参见示例,这实际上是关于将输出格式化为特定的报表结构,最好通过报表工具或其他表示代码来处理,而不是试图在SQL中将其组合在一起。您使用的是哪种SQL server-2008还是2012?2012具有SQL 2008无法实现的功能。目前我正在使用SQL server 2012。但是报表生成器将在过程中调用它。这实际上是将输出格式化为特定的报表结构,最好通过报表工具或其他表示代码来处理,而不是试图在SQL中将其组合在一起。您使用的是哪种SQL server-2008还是2012?2012具有SQL 2008无法实现的功能。目前我正在使用SQL server 2012。但是报表生成器将在PROC中调用它。