TSQL — объединение двух числовых полей, но разной длины

Извините, если это основной вопрос, но я не смог найти ответ в Google и т. Д.

У меня есть две таблицы: Таблица1, Таблица2

В таблице 1 есть поле «ACCOUNTNO», которое представляет собой числовое поле из 10 символов (пример: 1122334455).

В таблице 2 есть поле «SUBACCNO», которое представляет собой числовое поле из 12 символов (пример: 112233445501).

Как видите, SUBACCNO — это то же самое, что и ACCOUNTNO, но с двумя дополнительными цифрами в конце в диапазоне от 01 до 99.

Если я хочу присоединиться к двум таблицам и пробовал что-то вроде этого:

SELECT *
FROM TABLE1
JOIN TABLE2
ON TABLE1.ACCOUNTNO = TABLE2.SUBACCNO
WHERE STR(SUBACCNO) LIKE '1122334455%%'

Поскольку подстановочный знак нельзя применить к числовым данным, я попытался преобразовать его в строку с подстановочным знаком для последних двух символов. Однако это ничего не возвращает.

Кто-нибудь может дать совет? Спасибо!


person Community    schedule 28.06.2016    source источник
comment
Должны ли последние 2 цифры SUBACCNO не использоваться для сравнения?   -  person Sujeet Sinha    schedule 28.06.2016


Ответы (2)


Как насчет соединения столбца SUBACCNO, разделенного на 100:

SELECT *
FROM TABLE1
JOIN TABLE2
    ON TABLE1.ACCOUNTNO = TABLE2.SUBACCNO / 100

На самом деле, чтобы быть в безопасности, вы можете явно усечь частное до нулевого десятичного знака, используя ROUND():

SELECT *
FROM TABLE1
JOIN TABLE2
    ON ROUND(TABLE1.ACCOUNTNO, 0, 1) = ROUND(TABLE2.SUBACCNO / 100, 0, 1)
person Tim Biegeleisen    schedule 28.06.2016
comment
Похоже, округление помогло. Спасибо за решение. - person ; 28.06.2016

Ваше соединение не будет работать..

Попробуйте это, это не Sargable.. если вы не можете изменить свой дизайн

SELECT *
FROM TABLE1
JOIN TABLE2
ON TABLE1.ACCOUNTNO = cast(substring(TABLE2.SUBACCNO,1,10) as bigint)

вы также можете добавить еще один вычисляемый столбец, как показано ниже, и проиндексировать его для хорошей производительности, что я рекомендую, если вы часто используете запросы такого типа.

create table yourtable
(
accno bigint,
accno1 as  cast(substring(accno,1,10) as bigint) persisted
)

Теперь вы можете индексировать столбец выше для хорошей производительности.

person TheGameiswar    schedule 28.06.2016