在一张桌子上,我有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
答案 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的值。