JOIN с условие OR и използвайте само MIN(колона)

Имам две маси. Някои стойности от таблица 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

Логиката трябва да е следната: Колона A от таблица t трябва да съответства на колона matchA от таблица m и т.н. Както можете да видите в примера, може да има няколко съвпадения. В първия ред на таблица t стойността y на колона B съвпада с y на първия ред на таблица m в колона matchB. Първият ред на таблица t обаче съвпада и с втория ред на таблица m със стойността z в колони C и matchC. Ако случаят е такъв, само съвпадението с най-ниското priority трябва да бъде върнато в набора от резултати. Трябва да се покаже стойността на колона targetValue.

Знам как да направя съпоставянето, но не знам как да филтрирам само до резултата с най-нисък приоритет.

Това е, което имам досега.

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

Това връща и двата съвпадащи реда. Искам обаче само съвпадението с най-ниската стойност в колона priority.


person beta    schedule 25.08.2020    source източник


Отговори (1)


Това изглежда като добър случай на използване за странично свързване -- или APPLY на езика на SQL Server:

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
person Gordon Linoff    schedule 25.08.2020