sql - 通过比较两个表来识别缺失的组合
问题描述
我的主表中有 3 列。
- 得分(0-99,100-110)
- 率 (5-9 ,10-15)
- 位置(A,B)
我拥有这些的所有组合(2 * 2 * 2 = 8 个组合)
以下是我的主表中的组合
score rate location
----------------------------
0-99 5-9 A
100-110 5-9 A
0-99 10-15 A
100-110 10-15 A
0-99 5-9 B
100-110 5-9 B
0-99 10-15 B
100-110 10-15 B
我有另一个包含实际数据的表。我想找出实际表格中所有缺失的组合。如何找到那些缺失的组合并附加到列中值为“0”的实际表中?
实际数据
score rate location value
---------------------------------
0-99 10-15 A 3
100-110 10-15 A 6
0-99 10-15 B 1
预期产出
score rate location value
------------------------------------
0-99 5-9 A 0
0-99 10-15 A 3
100-110 10-15 A 6
100-110 5-9 B 0
0-99 10-15 B 1
100-110 5-9 A 0
100-110 10-15 B 0
0-99 10-15 B 0
解决方案
从您的实际数据和预期结果来看score
,rate
列location
值似乎是固定的,因此您可以使用UNION ALL
let score
, rate
,location
成为表。
CROSS JOIN
为score
, rate
,location
联合表生成笛卡尔积,制作完整表。
然后做OUTER JOIN
create table t(
score varchar(50),
rate varchar(50),
location varchar(50),
value int
);
insert into t values ('0-99','10-15','A',3);
insert into t values ('100-110','10-15','A',6);
insert into t values ('0-99','10-15','B',1);
查询 1:
SELECT
s.score,
r.rate,
l.location,
coalesce(t1.value,0)
FROM
(
SELECT '0-99' score
UNION ALL
SELECT '100-110'
) s
CROSS JOIN
(
SELECT '10-15' rate
UNION ALL
SELECT '5-9'
) r
CROSS JOIN
(
SELECT 'A' as "location"
UNION ALL
SELECT 'B'
) l
LEFT JOIN t t1 on s.score = t1.score and t1.rate = r.rate and t1.location = l.location
ORDER BY l.location
结果:
| score | rate | location | coalesce |
|---------|-------|----------|----------|
| 0-99 | 10-15 | A | 3 |
| 0-99 | 5-9 | A | 0 |
| 100-110 | 10-15 | A | 6 |
| 100-110 | 5-9 | A | 0 |
| 100-110 | 5-9 | B | 0 |
| 0-99 | 10-15 | B | 1 |
| 100-110 | 10-15 | B | 0 |
| 0-99 | 5-9 | B | 0 |
推荐阅读
- python - 如何通过pyinstaller在可执行文件中包含json
- blazor - 重复的项目模板 + 缺少自托管模板
- javascript - 重复选择的选项时如何节省资源
- python - 通过 xp_cmdshell & python os.system 以编程方式打开文本文件
- html - 如何在星评中添加显示小数部分的功能?
- c++ - 为什么我不能将运算结果乘以常数特征张量数组
- c++ - 在 mac 上的 Visual Studio 代码中设置 C++
- c++ - Poco.Crypto 库在构建 Poco 时未链接到 libssl.so。为什么?
- c# - 如何修复错误:'Web api 在 iis 上发布后从 SQL Server 获取数据时显示空白页'
- c# - 如何存储 Android 设备令牌?