【问题标题】:JOIN with OR condition and use only MIN(Column)使用 OR 条件加入并仅使用 MIN(Column)
【发布时间】:2020-08-25 11:22:17
【问题描述】:

我有两张桌子。表t 中的某些值需要与表m 中的某些值匹配,以便从表m 中识别目标值。

t 如下所示。

ID | A | B | C 
1  | x | y | z
2  | 1 | 2 | 3

m 如下所示。

matchA | matchB | matchC | priority | targetValue
NULL   | y      | NULL   | 1        | this
NULL   | NULL   | z      | 2        | that

逻辑应该如下:表t中的列A应该与表m中的列matchA匹配,依此类推。正如您在示例中看到的,可以有多个匹配项。在表t 的第一行中,B 列的值ymatchB 列中表m 的第一行的y 匹配。但是,表t 的第一行也与zz 的值在CmatchC 中的表m 的第二行匹配。如果是这种情况,则只应在结果集中返回具有最低 priority 的匹配项。应该显示列targetValue 的值。

我知道如何进行匹配,但我不知道如何过滤到具有最低优先级的结果。

这是我目前所拥有的。

SELECT * FROM t
    INNER JOIN m
        ON m.matchA = t.A
        OR m.matchB = t.B
        OR m.matchC = t.C

这会返回两个匹配的行。但是,我只想要priority 列中最低值的匹配项。

【问题讨论】:

    标签: sql tsql join aggregate


    【解决方案1】:

    这看起来是横向连接的一个很好的用例——或者 SQL Server 语言中的APPLY

    SELECT t.*, m.*
    FROM t OUTER APPLY
         (SELECT TOP (1) m.*
          FROM m
          WHERE m.matchA = t.A OR
                m.matchB = t.B OR
                m.matchC = t.C
          ORDER BY m.Priority
         ) m
    

    【讨论】:

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