Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Объединение таблиц по подстроке  [new]
Ninti_Niom
Member

Откуда:
Сообщений: 6
Добрый день

Необходимо объединить две таблицы по столбцам в одном из которых есть префикс документа, т.е в одной таблице в поле стоят цифры, а в другой префикс + эти же цифры
подскажите, как это можно сделать ?
7 дек 17, 11:06    [21014040]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
982183
Member

Откуда:
Сообщений: 1349
https://msdn.microsoft.com/ru-ru/library/ms187748(v=sql.120).aspx

SUBSTRING ( expression ,start , length )
7 дек 17, 11:22    [21014131]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 515
Ninti_Niom
Добрый день

Необходимо объединить две таблицы по столбцам в одном из которых есть префикс документа, т.е в одной таблице в поле стоят цифры, а в другой префикс + эти же цифры
подскажите, как это можно сделать ?

Слишком абстрактный вопрос - данные для примера есть?
Если префикс заранее не известен
1. SUBSTRING( [haystack], pos, len ) = [needle] - индексы по haystack работать не будут
2. [haystack] LIKE '%' + [needle] - будут работать индексы по haystack
Если известен алгоритм формирования [haystack]
3. [haystack] = func( [prefix], [needle] )
Если неизвестен алгоритм формирования
4. [haystack] LIKE '%' + [prefix] + '%' + [needle]
И т.д. и т.п.
Общая идея - использовать LIKE, PATINDEX, а не SUBSTRING/LEFT/RIGHT
7 дек 17, 11:29    [21014172]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
982183
Member

Откуда:
Сообщений: 1349
Да ладно ты развел теорию.
тут наверно студенту курсовой надо сдать.
А ты ему про индексы.
7 дек 17, 11:36    [21014214]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Cammomile
Member

Откуда:
Сообщений: 1019
У т2 можно сделать еще одно поле, где будут только префиксы, и соединять Т1.Префикс = Т2.Префикс

Если по условиям задачи т2 нельзя альтерить, то можно начитать ключи (айдишники я надеюсь) т2 во временную таблицу, и уже там сделать поле с префиксом.

Тогда будет
ФРОМ

ДЖОЙН Т1 ОН т1.Префикс = #Т.Префикс
ДЖОЙН Т2 ОН т2.ИД = #Т.ИД
7 дек 17, 11:41    [21014243]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Ninti_Niom
Member

Откуда:
Сообщений: 6
982183,
Руслан Дамирович,
префиксы известны
в упрощенном варианте, то что нужно:
1 табл 2 табл
ROSY KGITEM KGCO
5811 PC5811 58020510
5811 PC5811 58020510
5812 PC5812 58020321
5812 PC5812 58020321
5813 RS5813 58020322
5813 RS5813 58020322

SELECT ROSY, KGITEM, KGCO
FROM F1
LEFT JOIN F2 ON F1.ROSY = F2.****substring(KGITEM, 3, 4)?
WHERE ROCO = 001

есть и другой вариант - дописать префикс в 1 таблицу и так вытаксивать
7 дек 17, 11:44    [21014249]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
982183
Member

Откуда:
Сообщений: 1349
Ninti_Niom
F2.****substring(KGITEM, 3, 4)?


substring(F2.KGITEM, 3, 4)
7 дек 17, 11:59    [21014327]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
982183
Member

Откуда:
Сообщений: 1349
А ты точно уверен, что тебе нужен LEFT JOIN?
7 дек 17, 12:01    [21014338]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Ninti_Niom
Member

Откуда:
Сообщений: 6
982183
А ты точно уверен, что тебе нужен LEFT JOIN?

достать значения из второй таблицы - все данные из первой + то, что подпадает под условие из второй -
разве не left join?

не сработала конструкция по замене значений в столбце
update F1
set ROSY = CONCAT('PC', ROSY)
WHERE ROCO = 001

тип данных и размерность совпадают..

а в join-е по substr добавляет столбцы с null значениями
7 дек 17, 12:18    [21014458]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Ninti_Niom
Member

Откуда:
Сообщений: 6
спасибо вам большое,
еще перечитаю ссылки

SELECT ROSY, KGITEM, KGCO
FROM F1
LEFT JOIN F2 ON concat('PC', F1.ROSY) = F2.KGITEM
WHERE ROCO = 001

получилось вот так вытащить
7 дек 17, 12:24    [21014504]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Cammomile
Member

Откуда:
Сообщений: 1019
Ninti_Niom, плохой код, нельзя джойнить на результаты скаляров.

Сделай временную развязочную таблицу.
7 дек 17, 12:37    [21014589]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Ninti_Niom
Member

Откуда:
Сообщений: 6
Cammomile
Ninti_Niom, плохой код, нельзя джойнить на результаты скаляров.

Сделай временную развязочную таблицу.

была использована промежуточная таблица
спасибо
7 дек 17, 14:24    [21015153]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Cammomile
Member

Откуда:
Сообщений: 1019
С фу-й в условии соединения ты гарантированно не попадаешь в индекс, если он есть.
7 дек 17, 14:52    [21015273]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Ninti_Niom
Member

Откуда:
Сообщений: 6
Cammomile, хм.. одна таблица вообще без ключей была...
а условие более жесткое было
радует что единичная надобность
7 дек 17, 15:03    [21015344]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 1600
982183
Да ладно ты развел теорию.
тут наверно студенту курсовой надо сдать.
А ты ему про индексы.


Да, сейчас время обострения
7 дек 17, 15:05    [21015356]     Ответить | Цитировать Сообщить модератору
 Re: Объединение таблиц по подстроке  [new]
982183
Member

Откуда:
Сообщений: 1349
Если не указано иное, то этот вариант надо считать "по умолчанию".
8 дек 17, 05:41    [21017028]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить