【发布时间】:2018-04-29 23:21:18
【问题描述】:
在一张桌子上我有 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
如果我的组是例如。按数据1,数据2分组
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
【问题讨论】:
-
我想你有一个XY Problem。你能解释一下用例吗?
-
很高兴您将示例数据发布为 DDL+DML、您当前的尝试和您想要的结果。但是,您的问题文本可能会更清楚。你应该想想你会向不做 SQL 的人解释这个问题,然后edit你的问题更清楚。
标签: sql-server tsql