Sql 比较两个表,找出缺少的组合
我的主表中有3列Sql 比较两个表,找出缺少的组合,sql,postgresql,Sql,Postgresql,我的主表中有3列 得分(0-99100-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
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
您可以尝试使用
交叉联接
为分数
,比率
,位置
列生成笛卡尔积,生成完整的表格
然后根据交叉连接
表执行外部连接
create table t(
score varchar(50),
rate varchar(50),
location varchar(50),
value int
);
insert into t values ('0-99','5-9','A',2);
insert into t values ('0-99','10-15','A',3);
insert into t values ('100-110','10-15','A',6);
insert into t values ('100-110','5-9','B',7);
insert into t values ('0-99','10-15','B',1);
查询1:
SELECT
s.score,
r.rate,
l.location,
coalesce(t1.value,0)
FROM
(SELECT DISTINCT score FROM T) s
CROSS JOIN
(SELECT DISTINCT rate FROM T) r
CROSS JOIN
(SELECT DISTINCT location FROM T) 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 | 2 |
| 100-110 | 10-15 | A | 6 |
| 100-110 | 5-9 | A | 0 |
| 0-99 | 10-15 | B | 1 |
| 0-99 | 5-9 | B | 0 |
| 100-110 | 10-15 | B | 0 |
| 100-110 | 5-9 | B | 7 |
:
SELECT
s.score,
r.rate,
l.location,
coalesce(t1.value,0)
FROM
(SELECT DISTINCT score FROM T) s
CROSS JOIN
(SELECT DISTINCT rate FROM T) r
CROSS JOIN
(SELECT DISTINCT location FROM T) 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 | 2 |
| 100-110 | 10-15 | A | 6 |
| 100-110 | 5-9 | A | 0 |
| 0-99 | 10-15 | B | 1 |
| 0-99 | 5-9 | B | 0 |
| 100-110 | 10-15 | B | 0 |
| 100-110 | 5-9 | B | 7 |
您可以尝试使用
交叉联接
为分数
,比率
,位置
列生成笛卡尔积,生成完整的表格
然后根据交叉连接
表执行外部连接
create table t(
score varchar(50),
rate varchar(50),
location varchar(50),
value int
);
insert into t values ('0-99','5-9','A',2);
insert into t values ('0-99','10-15','A',3);
insert into t values ('100-110','10-15','A',6);
insert into t values ('100-110','5-9','B',7);
insert into t values ('0-99','10-15','B',1);
查询1:
SELECT
s.score,
r.rate,
l.location,
coalesce(t1.value,0)
FROM
(SELECT DISTINCT score FROM T) s
CROSS JOIN
(SELECT DISTINCT rate FROM T) r
CROSS JOIN
(SELECT DISTINCT location FROM T) 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 | 2 |
| 100-110 | 10-15 | A | 6 |
| 100-110 | 5-9 | A | 0 |
| 0-99 | 10-15 | B | 1 |
| 0-99 | 5-9 | B | 0 |
| 100-110 | 10-15 | B | 0 |
| 100-110 | 5-9 | B | 7 |
:
SELECT
s.score,
r.rate,
l.location,
coalesce(t1.value,0)
FROM
(SELECT DISTINCT score FROM T) s
CROSS JOIN
(SELECT DISTINCT rate FROM T) r
CROSS JOIN
(SELECT DISTINCT location FROM T) 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 | 2 |
| 100-110 | 10-15 | A | 6 |
| 100-110 | 5-9 | A | 0 |
| 0-99 | 10-15 | B | 1 |
| 0-99 | 5-9 | B | 0 |
| 100-110 | 10-15 | B | 0 |
| 100-110 | 5-9 | B | 7 |
,我已更新了我的实际数据。在这种情况下,我如何获得所需的解决方案?@user8545255您的实际数据没有
rate=5-9
为什么您希望获得rate=5-9
?是否有任何表格可以与之连接
,或者它是硬代码?我已更新了我的实际数据。在这种情况下,我如何获得所需的解决方案?@user8545255您的实际数据没有rate=5-9
为什么您希望获得rate=5-9
?是否有任何表格可以与之连接
,或者它是硬代码?