T- SQL: Как я могу присоединиться к каждой строке по-разному - PullRequest
0 голосов
/ 29 мая 2020

Как я могу объединить две таблицы, которые имеют разные поля и требуют разных правил для СОЕДИНЕНИЯ? Пример:

tb_references               tb_parts
==================          ====================
f_type  |  f_item           f_partID  |  f_partnumber
------------------          --------------------
YY      |  ABC123           1         |  YYABC123
YY      |  ABC124           2         |  YYABC124
NN      |  000111           3         |  YY000111
NN      |  000112           4         |  YY000112

Чтобы присоединиться к ним, я обычно выполняю следующий запрос:

SELECT * 
FROM tb_references
JOIN tb_parts
ON f_type + f_item = f_partnumber

Однако вы можете увидеть, где f_type из NN выиграл не совпадают, поэтому мои результаты будут выглядеть следующим образом:

RESULTS
=============================================
f_type  | f_item  | f_partID  | f_partnumber
---------------------------------------------
YY      | ABC123  | 1         | YYABC123
YY      | ABC124  | 2         | YYABC124

Как я могу указать оператор IF в запросе, чтобы я мог также сопоставить сломанные части NN?

Что-то вроде этого logi c, но я не могу понять, как это сделать sh, хотя я безуспешно пробовал различные методы:

SELECT * 
FROM tb_references
JOIN tb_parts
ON 
 IF (
    f_type = 'NN' THEN
      'YY' + f_item = f_partnumber
    )
 ELSE (
    f_type + f_item = f_partnumber
 )

Тогда мои оптимальные результаты были бы быть таким:

RESULTS
=============================================
f_type  | f_item  | f_partID  | f_partnumber
---------------------------------------------
YY      | ABC123  | 1         | YYABC123
YY      | ABC124  | 2         | YYABC124
NN      | 000111  | 3         | YY000111
NN      | 000112  | 4         | YY000112

Я открыт, конечно, для других решений, которые не используют IF в JOIN - это просто мой способ попытаться описать проблему, с которой я сталкиваюсь . К сожалению, я не могу просто обновить поле «f_type», потому что это сторонняя база данных, которую мы не можем ни контролировать, ни редактировать.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Вы можете использовать оператор CASE. Впрочем, это может быть болезненно:

SELECT * 
FROM tb_references
JOIN tb_parts
ON CASE WHEN f_type='yy' THEN 'zz' ELSE f_type END  + f_item = f_partnumber
0 голосов
/ 30 мая 2020

Если длина префикса для f_partnumber всегда равна 2, вы можете просто заменить их пустым символом в соединении.

SELECT DISTINCT * 
FROM tb_references r
JOIN tb_parts p ON r.f_item = REPLACE(f_partnumber, LEFT(p.f_partnumber, 2), '')
...