【问题标题】:Join when match other wise use default value匹配时加入,否则使用默认值
【发布时间】:2016-01-18 21:21:25
【问题描述】:

我有两张桌子一个

C1  C2  Value
All All  5
da  All  6

和表 b

C1  C2  
cc  a  
da  b 

我想获取表 b 的匹配值

C1  C2  Value
cc  a   5
da  b   6

我这样写一个查询

select b.*,a.* from a, b 
where 1=(case when a.C1=b.C1 then 1 
         when a.C1='All' then 1
         else 0)
and 1=(case when a.C2=b.C2 then 1 
         when a.C2='All' then 1
         else 0)

得到结果

C1  C2  Value
cc  a   5
da  b   6    
da  b   5 

我怎样才能得到查询以得到如下结果

C1  C2  Value
cc  a   5
da  b   6 

基本上当有匹配时使用匹配值,否则使用默认值'All',非常感谢!

【问题讨论】:

  • 表 A 是否有可能在 C1 中有一行“All”,而在 C2 中有一个类似“b”的值?如果是这样,在这种情况下结果会如何?
  • 您的语句不会执行 - 您需要为每个 CASE 表达式添加一个 END

标签: sql oracle join


【解决方案1】:

你需要的输出对我来说不是很清楚,但也许你需要这样的东西:

select c1, c2 , value from
(
 select b.c1, b.c2, a.value,
 row_number() over ( partition by decode(a.c1, 'all', 0, 1) + decode(a.c2, 'all', 0, 1)
                     order by     decode(a.c1, 'all', 0, 1) + decode(a.c2, 'all', 0, 1) desc
                   ) as num
 from a join b
 on ( a.c1 = 'all' OR a.c1 = b.c1) and 
    ( a.c2 = 'all' OR a.c2 = b.c2)
)
where num = 1;

希望对你有帮助

【讨论】:

    【解决方案2】:

    有些不寻常的连接条件。使用合并的左外连接可能是获得所需内容的简单方法,前提是性能不受限制。

    select b.*, COALESCE(a1.Value, a2.Value, a3.Value, a4.Value)
    from b LEFT OUTER JOIN a a1
    ON a1.C1=b.C1 AND a1.C2=b.C2
    LEFT OUTER JOIN a a2
    ON a2.C1=b.C1 AND a2.C2='All'
    LEFT OUTER JOIN a a3
    ON a3.C1='All' AND a3.C2=b.C2
    LEFT OUTER JOIN a a4
    ON a4.C1='All' AND a4.C2='All'
    

    请注意,如果有,您将获得多行:

    • 多条记录包含All、All;
    • a 中的 C1、C2 列有多个匹配项;

    【讨论】:

      【解决方案3】:

      Oracle 设置

      CREATE TABLE table_a ( C1, C2, Value ) AS
      SELECT 'All', 'All', 5 FROM DUAL UNION ALL
      SELECT 'da',  'All', 6 FROM DUAL UNION ALL
      SELECT 'da',  'b', 4 FROM DUAL;
      
      CREATE TABLE table_b ( C1, C2 ) AS
      SELECT 'cc', 'a' FROM DUAL UNION ALL
      SELECT 'da', 'b' FROM DUAL UNION ALL
      SELECT 'da', 'c' FROM DUAL;
      

      查询

      SELECT b.C1,
             b.C2,
             ( SELECT MAX ( value ) KEEP (
                          DENSE_RANK FIRST
                          ORDER BY 
                            CASE WHEN b.C1 = a.C1 AND b.C2 = a.C2 THEN 1
                                 WHEN b.C1 = a.C1                 THEN 2
                                 ELSE                                  3
                                 END ASC
                        )
               FROM   table_a a
               WHERE  ( b.C1 = a.C1  AND b.C2 = a.C2  )
               OR     ( b.C1 = a.C1  AND a.C2 = 'All' )
               OR     ( a.C1 = 'All' AND a.C2 = 'All' )
             ) AS Value
      FROM   table_b b;
      

      结果

      C1 C2      VALUE
      -- -- ----------
      cc a           5 
      da b           4 
      da c           6 
      

      查询 2

      SELECT b.C1,
             b.C2,
             MAX ( value ) KEEP (
                  DENSE_RANK FIRST
                  ORDER BY 
                    CASE WHEN b.C1 = a.C1 AND b.C2 = a.C2 THEN 1
                         WHEN b.C1 = a.C1                 THEN 2
                         ELSE                                  3
                         END ASC
             ) AS Value
      FROM   table_b b
             INNER JOIN
             table_a a
      ON         ( b.C1 = a.C1  AND b.C2 = a.C2  )
             OR  ( b.C1 = a.C1  AND a.C2 = 'All' )
             OR  ( a.C1 = 'All' AND a.C2 = 'All' )
      GROUP BY b.C1, b.C2;
      

      查询 3

      SELECT C1,
             C2,
             Value
      FROM   (       
        SELECT b.C1,
               b.C2,
               value,
               ROW_NUMBER() OVER (
                 PARTITION BY b.C1, b.C2
                 ORDER BY  CASE WHEN b.C1 = a.C1 AND b.C2 = a.C2 THEN 1
                                WHEN b.C1 = a.C1                 THEN 2
                                ELSE                                  3
                                END ASC
               ) AS RN
        FROM   table_b b
               INNER JOIN
               table_a a
        ON         ( b.C1 = a.C1  AND b.C2 = a.C2  )
               OR  ( b.C1 = a.C1  AND a.C2 = 'All' )
               OR  ( a.C1 = 'All' AND a.C2 = 'All' )
      )
      WHERE  rn = 1;
      

      所有结果都应该相同。

      【讨论】:

        【解决方案4】:

        试试这个:

            SELECT b.C1,
                   b.C2,
                   max(value) value 
              FROM a 
        INNER JOIN b ON (DECODE (a.C2, 'All', b.C2,a.C2) = b.C2 AND DECODE (a.C1, 'All', b.C1,a.C1) = b.C1)
          GROUP BY b.C1,
                   b.C2
        

        【讨论】:

          猜你喜欢
          • 2016-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-21
          • 1970-01-01
          相关资源
          最近更新 更多