Склеить две ИТЗ - какое соединение применить?

Автор Злоп, Вчера в 04:25

« назад - далее »

Злоп

Клинит меня на джойнах, в голове места мало, не улягутся там...
.
Есть две ИТЗ

Артикул-БрендБаза-(тут можно еще пустые колонки какие надо) и
Артикул-БрендПрайс-(тут можно еще пустые колонки какие надо)

как их склеить джойнами по Артикул, чтобы получить
Арикул-БрендБаза-БрендПрайс, для всех возможных пар БрендБаза-БрендПрайса для каждого артикула...

?
Спасибо

ADirks

как-то так
итБредПрайс.ДобавитьИндекс("иАртикул", "Артикул");
итБрендБаза.ПолноеСоединение("Артикул", итБредПрайс, "иАртикул", "БрендПрайс, <ДопКолонки>");

только это будут не все возможные комбинации брендов, а все комбинации строк (т.е. возможны дубли)

Злоп

не, надо все возможные комбинации БрендБаза-БрендПрайс для каждого артикула отдельно
и потом "сложить" все получившиеся пары без учета артикулов
т.е. если Для

Арт1 есть БрендБаза=АААА, БрендПрайс=ББББ
Арт1 есть БрендБаза=СССС, БрендПрайс=ДДДД
Арт2 есть БрендБаза=ВВВВ, БрендПрайс=ГГГГ
Арт3 есть БрендБаза=АААА, БрендПрайс=ГГГГ
Арт3 есть БрендБаза=CCCC, БрендПрайс=ЕЕЕЕ

то в результате в полученных парах БрендБаза-БрендПрайс
должны получиться пары
АААА-ББББ
АААА-ДДДД
СССС-ББББ
СССС-ДДДД
ВВВВ-ГГГГ
АААА-ГГГГ
АААА-ЕЕЕЕ
СССС-ГГГГ
СССС-ЕЕЕЕ

Злоп

Програмно-то я склеил как ндао, но душа хочет красоты в коде.
Чтобы кто посмотрел - чтобы ничего не понял ;-)

Грузчик

CROSS JOIN в sqlite. Но уложить ИТЗ в базу мне не удалось, только обычную ТаблицуЗначений.

Процедура Злоп()
    
    ТаблицаЗначений1 = СоздатьОбъект("ТаблицаЗначений");
    ТаблицаЗначений1.НоваяКолонка("Артикул", "Строка");
    ТаблицаЗначений1.НоваяКолонка("БрендБаза", "Строка");
    
    ТаблицаЗначений1.НоваяСтрока();
    ТаблицаЗначений1.Артикул = "Арт1";
    ТаблицаЗначений1.БрендБаза = "АААА";
    
    ТаблицаЗначений1.НоваяСтрока();
    ТаблицаЗначений1.Артикул = "Арт1";
    ТаблицаЗначений1.БрендБаза = "СССС";
    
    ТаблицаЗначений2 = СоздатьОбъект("ТаблицаЗначений");
    ТаблицаЗначений2.НоваяКолонка("Артикул", "Строка");
    ТаблицаЗначений2.НоваяКолонка("БрендПрайс", "Строка");
    
    ТаблицаЗначений2.НоваяСтрока();
    ТаблицаЗначений2.Артикул = "Арт1";
    ТаблицаЗначений2.БрендПрайс = "ББББ";
    
    ТаблицаЗначений2.НоваяСтрока();
    ТаблицаЗначений2.Артикул = "Арт1";
    ТаблицаЗначений2.БрендПрайс = "ДДДД";
    
    База = СоздатьОбъект("SQLiteBase");
    База.Открыть(":memory:");
    База.УложитьТЗ(ТаблицаЗначений1, "Таблица1");
    База.УложитьТЗ(ТаблицаЗначений2, "Таблица2");
    
    Запрос = База.НовыйЗапрос();
    Ответ = Запрос.ВыполнитьЗапрос("
    |SELECT
    |     Артикул [Артикул :Строка]
    |    ,БрендБаза [БрендБаза :Строка]
    |    ,БрендПрайс [БрендПрайс :Строка]
    |FROM
    |    Таблица1
    //|CROSS JOIN Таблица2 USING(Артикул) -- так чуть проще читается, и изменение структуры ТЗ ничего не погнёт
    |CROSS NATURAL JOIN Таблица2 -- чтобы никто не догадался
    |");
    
    База.Закрыть();
    Ответ.ВыбратьСтроку();
    
КонецПроцедуры // Злоп

Злоп

Вроде ВнутреннееСоединение для ИТЗ подходит?
.

ВнутреннееСоединение / InnerJoin
Синтаксис: ВнутреннееСоединение(стрКолонкиЛевойИТ, ПраваяИТ, ИндексПравойИТ, стрКолонкиПравойИТ)

Параметры:
стрКолонкиЛевойИТ - тип: Строка. Колонки, значения которых будут использованы для поиска строки в правой таблице.
ПраваяИТ - тип: ИндексированнаяТаблица. Присоединяемая таблица.
ИндексПравойИТ - тип: Строка, Число. Имя или номер индекса, по которому будут искаться строки в правой таблице. Количество колонок индекса должно быть равно количеству колонок поиска (см. параметр стрКолонкиЛевойИТ).
стрКолонкиПравойИТ - тип: Строка. Список колонок, которые будут копироваться из правой таблицы в левую. Список задаётся в формате "<ИмяКолИст>|<ИмяКолИст:ИмяКолНазн> [,...]". <ИмяКолИст> - имя колонки в правой таблице; если такой колонки нет в левой таблице, то она будет создана. <ИмяКолНазн> - если указана, то значение из колонки правой таблицы с названием <ИмяКолИст> будет скопировано в колонку левой таблицы <ИмяКолНазн>.

Описание: Выполняет операцию, аналогичную команде SQL Inner Join. Для каждой строки из левой таблицы (левой таблицей является текущий объект) добавляются все строки из правой таблицы, соответствующие ключевому выражению. Ключевое выражение определяется параметром стрКолонкиЛевойИТ. Из правой таблицы в левую переносятся значения колонок, указанных в параметре стрКолонкиПравойИТ. Если строка левой таблицы не найдена в правой, то строка в левой таблице удаляется.

?

Злоп

Во, вроде получилось!

//*******************************************
Процедура ЗлопЛучший()
   
   ИТЗбаза = СоздатьОбъект("ИндексированнаяТаблица");
      ИТЗбаза.НоваяКолонка("Артикул");
      ИТЗбаза.НоваяКолонка("БрендБаза");
      
   ИТЗпрайс = СоздатьОбъект("ИндексированнаяТаблица");
      ИТЗпрайс.НоваяКолонка("Артикул");
      ИТЗпрайс.НоваяКолонка("БрендПрайс");
   
    ИТЗбаза.НоваяСтрока(); ИТЗбаза.Артикул = "Арт1"; ИТЗбаза.БрендБаза = "АААА";
    ИТЗбаза.НоваяСтрока(); ИТЗбаза.Артикул = "Арт1"; ИТЗбаза.БрендБаза = "СССС";
    ИТЗбаза.НоваяСтрока(); ИТЗбаза.Артикул = "Арт2"; ИТЗбаза.БрендБаза = "ВВВВ";
    ИТЗбаза.НоваяСтрока(); ИТЗбаза.Артикул = "Арт3"; ИТЗбаза.БрендБаза = "АААА";
    ИТЗбаза.НоваяСтрока(); ИТЗбаза.Артикул = "Арт3"; ИТЗбаза.БрендБаза = "СССС";
    ИТЗбаза.НоваяСтрока(); ИТЗбаза.Артикул = "Арт4"; ИТЗбаза.БрендБаза = "ЖЖЖЖ";
   
    ИТЗпрайс.НоваяСтрока(); ИТЗпрайс.Артикул = "Арт1"; ИТЗпрайс.БрендПрайс = "ББББ";
    ИТЗпрайс.НоваяСтрока(); ИТЗпрайс.Артикул = "Арт1"; ИТЗпрайс.БрендПрайс = "ДДДД";
    ИТЗпрайс.НоваяСтрока(); ИТЗпрайс.Артикул = "Арт2"; ИТЗпрайс.БрендПрайс = "ГГГГ";
    ИТЗпрайс.НоваяСтрока(); ИТЗпрайс.Артикул = "Арт3"; ИТЗпрайс.БрендПрайс = "ГГГГ";
    ИТЗпрайс.НоваяСтрока(); ИТЗпрайс.Артикул = "Арт3"; ИТЗпрайс.БрендПрайс = "ЕЕЕЕ";
    ИТЗпрайс.НоваяСтрока(); ИТЗпрайс.Артикул = "Арт5"; ИТЗпрайс.БрендПрайс = "ЗЗЗЗ";
      
    ИТЗпрайс.ДобавитьИндекс("Артикул","^#Артикул",0);   
   
    ИТЗбаза.ВнутреннееСоединение("Артикул",ИТЗПрайс,"Артикул","БрендПрайс");
    ИТЗбаза.Показать();

КонецПроцедуры // ЗлопЛучший()

такие пары и показываются
АААА-ББББ
АААА-ДДДД
СССС-ББББ
СССС-ДДДД
ВВВВ-ГГГГ
АААА-ГГГГ
АААА-ЕЕЕЕ
СССС-ГГГГ
СССС-ЕЕЕЕ

Злоп


Злоп

Проверил на боевых данных ИТЗ.ВнутреннееСоединение, результат совпал с результатом ручной склейки кодом.