Имя: Пароль:
1C
1С v8
Соединить две таблицы с желательным условием
0 leshiy_SV
 
04.12.19
17:07
Добрый день.
Подскажите, как соединить две таблицы по условию, чтоб из второй таблицы взять желательно только то, что будет равно "Красный". Если такого нет, то взять любой.

|ТАБ1    |  
----------
|роза    |
|ромашка |
|Тюльпан |

|ТАБ2    |  
----------
|роза    |Красный|
|роза    |Желтый |
|ромашка |Белый  |
|Тюльпан |Красный|
|Тюльпан |Желтый |
|Тюльпан |Синий  |

Чтобы в итоге получилось
|роза    |Красный|
|ромашка |Белый  |
|Тюльпан |Красный|
1 sevod
 
04.12.19
17:15
Делаем временную таблицу из ТАБ2 (ВТ), с отбором по красному.
Дальше к ТАБ1 левое соединение ВТ и ТАБ2. isnull(ВТ, Таб2)
2 Ёпрст
 
04.12.19
17:16
2 запроса в юнион, в первом, соединение по ромашке и цвету, во втором только по ромашке, дальше группируешь и все, можешь еще приоритеты задать в запросах
3 leshiy_SV
 
05.12.19
12:34
ВЫБРАТЬ
    Цветы.Наименование КАК Наименование,
    ЦветыРазноцветные.Цвет КАК Цвет
ПОМЕСТИТЬ ВТ_Цветы_Красные
ИЗ
    Цветы КАК Цветы
    ЛЕВОЕ СОЕДИНЕНИЕ ЦветыРазноцветные КАК ЦветыРазноцветные
      ПО Цветы.Наименование = ЦветыРазноцветные.Наименование
        И (ЦветыРазноцветные.Цвет = ЗНАЧЕНИЕ(Справочник.Цвет.Красный))
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Цветы_Красные.Наименование КАК Наименование,
    ВЫБОР
        КОГДА ВТ_Цветы_Красные.Цвет ЕСТЬ NULL
            ТОГДА ЦветыРазноцветные.Цвет
        ИНАЧЕ ВТ_Цветы.ФормаОбучения
    КОНЕЦ КАК ВТ_Цветы_Красные.Цвет
ИЗ
    ВТ_Цветы_Красные КАК ВТ_Цветы_Красные
        ЛЕВОЕ СОЕДИНЕНИЕ ЦветыРазноцветные КАК ЦветыРазноцветные
        ПО ВТ_Цветы_Красные.Наименование = ЦветыРазноцветные.Наименование
            И (ЦветыРазноцветные.Цвет <> ЗНАЧЕНИЕ(Справочник.Цвет.Красный))

УПОРЯДОЧИТЬ ПО
    Наименование
АВТОУПОРЯДОЧИВАНИЕ
4 sevod
 
05.12.19
13:57
Вот это

ВЫБОР
        КОГДА ВТ_Цветы_Красные.Цвет ЕСТЬ NULL
            ТОГДА ЦветыРазноцветные.Цвет
        ИНАЧЕ ВТ_Цветы.ФормаОбучения
КОНЕЦ КАК ВТ_Цветы_Красные.Цвет

пишется одной строкой
ЕСТЬNULL(ЦветыРазноцветные.Цвет, ВТ_Цветы.ФормаОбучения)

что бы быстрее писать, не переключая раскладку, пишут ISNULL.
Если не понял, загугли ЕСТЬNULL() для 1С.
5 sevod
 
05.12.19
14:12
"ЕСТЬNULL(ЦветыРазноцветные.Цвет, ВТ_Цветы.ФормаОбучения)" А может наоборот :)
"ЕСТЬNULL(ВТ_Цветы.ФормаОбучения, ЦветыРазноцветные.Цвет)" Но думаю поймешь.


" ВТ_Цветы.ФормаОбучения" это откуда?
У тебя этот запрос вообще работает? У тебя соединение во втором запросе правильное? Я без конструктора плохо читаю запросы.
6 leshiy_SV
 
05.12.19
14:56
" ВТ_Цветы.ФормаОбучения" это откуда?

Это хвост из 1С: Университет. :)
Просто взял такой простой пример (цвета, цветочки), чтоб легче объяснить, что мне нужно. На самом деле там - студенты, статусы и прочие поля.
Запрос в реальности работает.
Сначала в таблицу с определенными студентами добавляю данные, которые есть у очников, а вторым присоединением через ISNULL() добавляю данные, которые есть у заочников. Суть запроса если студент учится и на очном и на заочном, то в приоритете в итоговую таблицу попадали данные по очной форме.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший