#sql #database #netezza
Вопрос:
Я пытаюсь соединить 2 таблицы слева, используя «идентификатор заказа» из таблицы a и ‘ссылка на заказ » из таблицы b.
Проблема в том, что там, где заказ будет полностью числовым «12345», ссылка на заказ будет содержать букву перед тем же номером «a12345».
Интересно, есть ли способ выполнить объединение, но проигнорировать букву из таблицы b?
Любые идеи приветствуются
Спасибо
Ответ №1:
Конечно. То, что вы видите в СОЕДИНЕНИИ, — это утверждения об истинности; они вообще не должны иметь никакого отношения к табличным данным
A JOIN B ON EXTRACT(HOUR FROM NOW()) = 12
Это объединит все строки в A со всеми строками в B, но только в течение одного часа в день (вы должны запускать его между 12:00 и 12:59:59) — это не имеет ничего общего с данными таблицы
Представьте, что объединения работают следующим образом: «каждая строка в A соединяется с каждой строкой в B, а затем утверждения истинности оцениваются для каждой строки в результате. Если истина ложна, строка отбрасывается. Следовательно, значение an ON 1=1
допустимо и включает все строки, потому что оно всегда истинно..
Таким образом, объединение всех строк от A до B, где B-это строка с буквой «a» в начале, было бы чем-то вроде:
A JOIN B ON A.ID = SUBSTR(B.ID, 2, LENGTH(B.ID) - 1))
Однако будьте осторожны; манипулирование табличными данными может свести на нет использование индексов
Подумайте также о том, что вы могли бы сделать B.ID LIKE CONCAT('_', A.ID)
Ответ №2:
Если ссылка на заказ всегда будет иметь префикс из одной буквы к идентификатору заказа, то просто присоединитесь к подстроке первого:
SELECT *
FROM TableA a
INNER JOIN TableB b
ON SUBSTR(b.order_ref, 2, LENGTH(b.order_ref) - 1) = a.order_id;
Если ссылка на заказ может иметь или не иметь этот префикс из одной буквы, вы можете попробовать присоединиться при любом условии:
SELECT *
FROM TableA a
INNER JOIN TableB b
ON b.order_ref = a.order_id OR
SUBSTR(b.order_ref, 2, LENGTH(b.order_ref) - 1) = a.order_id;
Ответ №3:
Рассмотрите возможность использования набора функций regexp_*, чтобы помочь.
Напр.
select *
from A left join B
on
regexp_extract(A.order_id, ‘^D*(d )’, 1) =
regexp_extract(B.order_ref, ‘^D*(d )’, 1);
В этом случае D*
указывается ноль или более вхождений нецифровых символов, за которыми следует одна или несколько цифр, которые заключены в скобки. Это позволяет вам не игнорировать префиксы цифр, если таковые имеются, во время соединения