Sql 比较两个表,找出缺少的组合

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

我的主表中有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    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
    ?是否有任何表格可以
    与之连接
    ,或者它是硬代码?