填充缺失的行,与每组GROUP BY一起加入RIGHT JOIN

时间:2018-04-29 00:36:47

标签: sql-server tsql

在一张桌子上,我有Id,并且应该完成10个测试的名称。 在第二个SN产品,TestDate和Id测试已完成此产品。 我需要找到,并展示应该做的测试,但事实并非如此。

使用CROSS JOIN解决方案,LEFT OUTER JOIN适用于1000行,但对于8000-15000,需要很长时间1-3分钟。 数据由CTE查询

准备

下面的例子 我想在每个组@ Table2

中添加“缺失”行
@Table1 => four tests which should be done 
       number - Id of test
       data3  -name of test
@Table2 => tests which were done
       data1 - id of tested device
GROUP   => tests of one device

DECLARE @table1 TABLE (data3 NVARCHAR(20), number INT)
DECLARE @table2 TABLE (data1 NVARCHAR(20), data2 NVARCHAR(20), number INT)  

INSERT INTO @table1 
    SELECT 'xx', 1 
    UNION ALL 
    SELECT 'ee', 2 
    UNION ALL 
    SELECT 'zz', 3 
    UNION ALL 
    SELECT 'gg', 4

INSERT INTO @table2 
    SELECT '1', 'aaaaaaaaaa', 1 --GROUP 1
    UNION ALL 
    SELECT '1', 'aaaaaaaaaa', 2 --GROUP 1
    UNION ALL 
    SELECT '1', 'aaaaaaaaaa', 3 --GROUP 1
    UNION ALL 
    SELECT '2', 'bbbbbbbbbb', 1 --GROUP 2
    UNION ALL 
    SELECT '2', 'bbbbbbbbbb', 2 --GROUP 2
    UNION ALL 
    SELECT '3', 'cccccccccc', 1 --GROUP 3
    UNION ALL 
    SELECT '3', 'cccccccccc', 3 --GROUP 3

使用此查询只添加了一行(第一行),我需要填充table2的每一组

如果我的小组是例如。 GROUP BY data1,data2

SELECT * 
FROM @table2 t2
RIGHT JOIN @table1 t1 ON t2.number = t1.number
ORDER BY t2.data1, t1.number

输出:

 data1  data2       number  data3   number
 -----------------------------------------
 NULL   NULL        NULL    gg      4
 1      aaaaaaaaaa  1       xx      1
 1      aaaaaaaaaa  2       ee      2
 1      aaaaaaaaaa  3       zz      3
 2      bbbbbbbbbb  1       xx      1
 2      bbbbbbbbbb  2       ee      2
 3      cccccccccc  3       zz      3
 3      cccccccccc  1       xx      1

这是我要求的输出(虽然只有一个“数字”列也可以使用)

 data1  data2       number  number3
 -----------------------------------------
 1      aaaaaaaaaa  1       1          --GROUP 1
 1      aaaaaaaaaa  2       2          --GROUP 1
 1      aaaaaaaaaa  3       3          --GROUP 1
 NULL   NULL        NULL    4          --GROUP 1
 2      bbbbbbbbbb  1       1          --GROUP 2
 2      bbbbbbbbbb  2       2          --GROUP 2
 NULL   NULL        NULL    3          --GROUP 2
 NULL   NULL        NULL    4          --GROUP 2
 3      cccccccccc  1       1          --GROUP 3
 NULL   NULL        NULL    2          --GROUP 3
 3      cccccccccc  3       3          --GROUP 3
 NULL   NULL        NULL    4          --GROUP 3

1 个答案:

答案 0 :(得分:0)

缺少值时,为什么data1为空?我猜他们必须从table2填充。试试这个问题:

;with cte as (
    select
        distinct a.data1, b.number, b.data3
    from
        @table2 a
        cross join @table1 b
)

select
    c.data1, t.data2, t.number, c.data3, number3 = c.number
from
    cte c
    left join @table2 t on c.data1 = t.data1 and c.number = t.number

输出

data1   data2        number   data3   number3
---------------------------------------------
1       aaaaaaaaaa   1        xx      1
1       aaaaaaaaaa   2        ee      2
1       aaaaaaaaaa   3        zz      3
1       NULL         NULL     gg      4
2       bbbbbbbbbb   1        xx      1
2       bbbbbbbbbb   2        ee      2
2       NULL         NULL     zz      3
2       NULL         NULL     gg      4
3       cccccccccc   1        xx      1
3       NULL         NULL     ee      2
3       cccccccccc   3        zz      3
3       NULL         NULL     gg      4

如果确实需要在data1列中显示空值,则添加case语句以检查data2的值。