【问题标题】:Allays return value from left table in joinAllays 从连接中的左表返回值
【发布时间】:2020-09-03 01:22:02
【问题描述】:

我有 2 张桌子 甲和乙

A 有 cols(AKey, val1, val2) B 有 Cols(BKey,Akey, ValX, valY)

我有以下问题

    select a.Val1,a.Val2,b.ValX
    from A
    Left Join B on a.AKey = b.Akey
    where a.Akey ={someValue}
    and ((b.valY ={aDifferentVal}) or (b.valY is NULL))

情况是我总是想从表 A 中返回值。 这在连接中存在 {aDifferentVal} 时有效,当表 B 中没有用于连接的值时它也有效,但是当表中存在用于连接的值但这些都不是 {aDifferentVal} 时,则查询什么都不返回,我仍然想要表 A 中的值。

我怎样才能做到这一点?

【问题讨论】:

    标签: sql left-join where-clause sql-null


    【解决方案1】:

    只需将left joined 表上的条件从where 子句移动到连接的on 子句 - 否则它们将成为强制性的,并且它们未填充的行将被归档(此处删除行匹配但其valy{adifferentval} 不匹配):

    select a.val1,a.val2,b.valx
    from a
    left join b 
        on  b.akey = a.akey
        and b.valy = {adifferentval}
    where a.akey = {somevalue}
    

    【讨论】:

      【解决方案2】:

      second表上的条件移动到on子句:

      select a.Val1,a.Val2,b.ValX
      from A Left Join
           B
           on a.AKey = b.Akey and (b.valY ={aDifferentVal})
      where a.Akey = {someValue}
      

      where 子句中的过滤(有点)将外连接变成内连接。您的版本稍好一些,因为它正在检查NULL。但是,匹配的行是:

      • 在 B 中完全不匹配的 A 值。
      • 与您指定的条件匹配的 A 值。

      过滤掉的是与 B 中的一行匹配的 A 值,但没有一个匹配符合您指定的条件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-22
        • 2015-02-10
        • 1970-01-01
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多