【问题标题】:How to join on a default value from the 2nd table if no match is found?如果找不到匹配项,如何加入第二个表中的默认值?
【发布时间】:2019-11-20 12:26:32
【问题描述】:

我正在寻找一种方法来加入 2 个表,如下所示:

T1:           T2:

a    b         c    d    e          
-------        -------------        
1    b1        1    d1   e1         
2    b2        2    d2   e2         
3    b3        ST   d0   e0         


--> join on T1.a = T2.c (if no match found join on T1.c = ST)
a    b    c    d    e
----------------------
1    b1   1    d1   e1
2    b2   2    b2   e2
3    b3   ST   d0   e0         <- No match found so ST values are used.

现在我只在 T2.c 是整数时找到了一种方法。我做了一个条件连接 en 之后,我每隔一列取 c en group 的最大值。

有没有办法像匹配列中的示例那样使用字符串值?

谢谢

【问题讨论】:

  • 第二个表中是否只有一个非数字值?
  • 不,还有更多。这只是我的问题的基础。实际上,连接在列上匹配,第二列(属性)定义了需要在第一列中使用的默认值。所以当属性列是'at1'时。需要使用的默认值在 t2.c ='St' 的行中 当属性列 ='at2' 时,需要使用的默认值在 t2.c ='St2' 的行中。但这并不是真正的问题。加上@GordonLinoff 的回答,我已经成功了。

标签: sql tsql join


【解决方案1】:

你想要一个默认值。你可以使用left join:

select t1.*, coalesce(t2.c, t2def.c) as c,
       coalesce(t2.d, t2def.d) as d, coalesce(t2.e, t2def.e) as e
from t1 left join
     t2
     on t1.a = t2.c left join
     t2 t2def
     on t2def.c = 'ST';

或者,您可以使用apply

select t1.*, t2.*
from t1 outer apply
     (select top (1) t2.*
      from t2
      where t2.c in ('ST', t1.a)
      order by (case when t2.c = 'ST' then 2 else 1 end)
     ) t2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    相关资源
    最近更新 更多