SQL условное соединение с условными приоритетами, как в операторе CASE - PullRequest
0 голосов
/ 26 сентября 2019

Как условно присоединиться к (1) полному ключу ИЛИ (2) части ключа, если первое условие не выполнено.Предположим, идентификатор состоит из 7 символов.

select 
a.id,
coalesce (t.somevalue, t2.somevalue)
from a

left join t
on a.id=t.id

left join t as t2
on left(a.id,6)=left(t2.id,6)

Возможно ли вышеуказанное объединение за один выстрел?Что-то вроде этого, но поддержание приоритета соединения с полным ключом над соединением с ключом детали?

left join t
on 
a.id=t.id OR left(a.id,6)=left(t2.id,6)

Интересно, есть ли что-то вроде

left join t
on 
case when condition 1
case when condition 2

Вот пример данных и ожидаемые результаты.

+---------+
|  a.id   |
+---------+
| aaaaa0A |
| aaaaa0B |
| aaaaa1A |
| aaaaa2A |
| aaaaa3B |
+---------+

+---------+
| t.id    |
+---------+
| aaaaa0C |
| aaaaa1B |
| aaaaa1A |
| aaaaa2B |
| aaaaa3A |
+---------+

+---------+---------+--------------+
| a.id    | t.id    | condition no |
+---------+---------+--------------+
| aaaaa0A | aaaaa0C | 2            |
| aaaaa0B | aaaaa0C | 2            |
| aaaaa1A | aaaaa1A | 1            |
| aaaaa2A | aaaaa2B | 2            |
| aaaaa3B | aaaaa3A | 2            |
+---------+---------+--------------+

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Вы можете выполнить 2-е LEFT объединение t при условии, что 1-е объединение не совпадает:

select 
  a.id,
  coalesce(t1.id, t2.id) id,
  case 
    when t1.id is not null then 1
    when t2.id is not null then 2
    else 0
  end [condition no] 
from a
left join t as t1 on a.id = t1.id
left join t as t2 on t1.id is null and left(a.id, 6) = left(t2.id, 6)

См. Демонстрационную версию .Результаты:

> id      | id      | condition no
> :------ | :------ | -----------:
> aaaaa0A | aaaaa0C |            2
> aaaaa0B | aaaaa0C |            2
> aaaaa1A | aaaaa1A |            1
> aaaaa2A | aaaaa2B |            2
> aaaaa3B | aaaaa3A |            2
2 голосов
/ 26 сентября 2019

Я думаю, что вы хотите outer apply:

select a.id, t.somevalue
from a outer apply
     (select top (1) t.*
      from t
      where left(a.id, 6) = left(t.id, 6)
      order by (case when a.id = t.id then 1 else 2 end)  -- put full matches first
     ) t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...