子查询中的所有并集

  • 本文关键字:查询 sql sql-server
  • 更新时间 :
  • 英文 :


我需要一些帮助来获得以下解决方案。

我有一个case-when语句,当一个值是一个特定的数字时,我需要它返回一定数量的并集所有结果。下面的查询示例。

例如,if T0.Docnum = 1我需要它来返回9的3行。

显然,当我运行下面的查询时,我会得到子查询返回多个结果的错误。在这一点上我没有主意。

欢迎提出任何想法。

我正在使用SSMS和SQL Server 2016。

感谢

select 
case 
when cast(count(T0.Docnum) as nvarchar(max)) = 1 
then (select '999' 
union all
select '999'
union all
select '999'
union all
select '999'
union all
select '999') 
when cast(count(T0.docnum) as nvarchar(max)) = 2 
then (select '999' 
union all
select '999'
union all
select '999'
union all
select '999')
when cast(count(T0.docnum) as nvarchar(max)) = 3 
then (select '999' 
union all
select '999'
union all
select '999')
end

"生成"额外行的一种简单方法是使用CROSS APPLY

(GROUP BY之后,我在子查询中这样做…)

SELECT
*
FROM
(
SELECT
X,
Y,
COUNT(TO.docnum)   AS doc_count
FROM
something
GROUP BY
X,
Y
)
AS foo
CROSS APPLY
(
SELECT '999' AS generated
UNION ALL
SELECT '999' WHERE doc_count IN (3,2,1)
UNION ALL
SELECT '999' WHERE doc_count IN (2,1)
UNION ALL
SELECT '999' WHERE doc_count IN (1)
)
AS bar

始终返回1行
如果doc_count为1、2或3,则返回第二行。如果doc_count为1或2,则返回第三行
如果doc_coount为1 ,返回第四行

编辑:回复评论。

CROSS APPLY
(
SELECT '999' AS generated
UNION ALL
SELECT '999' WHERE doc_count IN (5,3,2,1)
UNION ALL
SELECT '999' WHERE doc_count IN (5,2,1)
UNION ALL
SELECT '999' WHERE doc_count IN (5,1)
UNION ALL
SELECT '999' WHERE doc_count IN (5)
)

所有五行都与doc_count=5的场景相匹配,因此它生成了五行。

但是只有四行与doc_count=1的场景匹配,因此将生成四行。

检查这个小提琴,看看它是否对你有帮助。我用了一个变量来模拟你的情况。我不太确定你确定行数的逻辑是什么。

我使用CTE生成任意数量的行,然后从中选择999

https://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=cbaf378f443139dc47c2bcc1f1190442d

DECLARE @docnum INT;
SET @docnum = 1;
WITH r AS (
SELECT 1 AS n
UNION ALL
SELECT n+1 FROM r WHERE n+1<= 
CASE WHEN @docnum = 3 then 1
when @docnum = 2 then 2
when @docnum = 1 then 3 end
)
SELECT 999 FROM r;

最新更新