Имя: Пароль:
1C
1С v8
Подскажите с запросом
0 Новичок_1С
 
31.01.23
07:32
Добрый день, коллеги.
Помогите пожалуйста с запросом.
Есть две таблицы, чтобы не погружаться в предметную область, напишу вымышленные данные:
а Q
а W
б E
с R

Вторая
а S
б D
с F
д G

Надо запросом вывести вторые колонки таблиц, связав по первой колонке. Получить таблицу вида

а Q S
а W
б E D
с R F
д   G

Спасибо !
1 Beduin
 
31.01.23
07:59
В первом запросе получаешь все возможные первые колонки, а во втором джойнишь с исходными табличками
2 Donkey_hot
 
31.01.23
08:01
(0)
а Q S
а W
б E D
с R F
д   G

Наверное во второй строке а W S?
3 Donkey_hot
 
31.01.23
08:04
(2) Если так, то обычное полное внешнее соединение. ВЫБРАТЬ Т1.К2, Т2.К2 из Т1 ПОЛНОЕ СОЕДИНЕНИЕ Т2 ПО Т1.К1 = Т2.К1
4 Новичок_1С
 
31.01.23
08:11
(3) Вот как раз нет. Итоговая таблица не должна включать дубли значений из первой и второй.
5 Мимохожий Однако
 
31.01.23
08:25
(4) Озвучь ВСЕ условия
6 KJlag
 
31.01.23
08:32
есть мысля пронумеровать от 1 в рамках первой колонки
а Q 1
а W 2
б E 1
с R 1

а S 1
б D 1
б K 2
с F 1
д G 1

а дальше как в (3) ВЫБРАТЬ Т1.К2, Т2.К2 из Т1 ПОЛНОЕ СОЕДИНЕНИЕ Т2 ПО Т1.К1 = Т2.К1 и Т1.К3 = Т2.К3
но чет пока буксую с добавлением этой нумерации в запросе.
7 mikecool
 
31.01.23
08:34
соревнование по выводу массива в запросе?
8 Donkey_hot
 
31.01.23
08:50
(4) А как определяется что с Q спаривается именно S, а не W?
9 RomanYS
 
31.01.23
08:53
(8) судя по (6) речь про FIFO
10 Новичок_1С
 
31.01.23
08:54
(9) Да верно, в порядке следования.
11 KJlag
 
31.01.23
08:54
(9) в (6) чисто мое предположение. и начальная мысля по реализации.
как хочет тс - хз
12 Donkey_hot
 
31.01.23
08:54
(9) Не ТС писал (6), может там совсем другая задача...
13 RomanYS
 
31.01.23
08:57
(11) сорян, думал ТС ползадачи решил)
Но мы угадали
14 Новичок_1С
 
31.01.23
09:01
(6) Интересное решение. Теперь надо подумать как реализовать эту нумерацию. На выходе как раз получится то, что надо !
15 Андрей_Андреич
 
naïve
31.01.23
09:07
(11) Правильно писать "тс-тз-хз"
16 Fedor-1971
 
31.01.23
09:39
(0) Если не важно к какому значению приклеится таблица 2, то примерно так:

Выбрать т.П1, максимум(т.П2) как П2
поместить в табМакс
из таб1 как Т
;
Выбрать т.П1, т.П2, т2.П2 как доп
поместить табПриклеено
из табМакс как Т
Левое соединение таб2 как Т2 по т2.П1 = т.П1
;
Выбрать т.П1, т.П2, ТП.доп из таб1 как т
Левое соединение табПриклеено как ТП по ТП.П1 = т.П1 И ТП.П2 = т.П2
17 magicSan
 
31.01.23
09:46
ламеры, через обединить делай
18 Новичок_1С
 
31.01.23
10:02
(17) Объединить даст в итоге две колонки вида

а Q
а W
б E
с R
а S
б D
с F
д G
19 magicSan
 
31.01.23
10:11
(18) не.. к перво йтаблице добавь пустое поле и ко квторой
20 magicSan
 
31.01.23
10:11
потом свернешь
21 Новичок_1С
 
31.01.23
10:26
(20)
а Q    null
а W    null
б E    null
с R    null
а null S
б null D
с null F
д null G

И что с чем сворачивать ?
22 magicSan
 
31.01.23
10:45
группировку по первому полю, по остальным макс()
23 Donkey_hot
 
31.01.23
10:52
(22) Результат будет немного не тот, который нужен ТС
24 magicSan
 
31.01.23
10:57
(23) да, точно, увидел ситуацию с "а"
25 Новичок_1С
 
31.01.23
10:57
(22) И получится таблица, по одной записи для
а
б
с
д

Это не то !
26 magicSan
 
31.01.23
11:05
(25) давай погружатся в предметную область
27 Новичок_1С
 
31.01.23
11:15
(26) ОЙ, на объяснение этого еще полдня уйдет.
Я сейчас доделаю по совету (6). По сути получается два запроса с выборкой и нумерацией. Потом третий запрос. Через МВТ засуну в запрос пронумерованные таблицы от первых двух запросов.
28 RomanYS
 
31.01.23
11:31
(27) В запросах сейчас есть Автономерзаписи. Можно пронумеровать внутри запроса, но возни всё равно будет с несколькими ВТ
29 Donkey_hot
 
31.01.23
11:38
(27) Так если нет требования все сделать в запросе, почему бы не выполнить полное соединение и потом почистить дубли в коде?
30 Said_We
 
31.01.23
11:56
(27) Чего там объяснять?
Ниже на Sqlite. Перевести на язык запросов 1С не сложно.
|| это конкатенация строк вместо знака +. А в 1С как раз будет +.

WITH vt1 as
(Select 'а' as k1, 'Q' as k2
UNION all SELECT 'а', 'W'
UNION all SELECT 'б', 'E'
UNION all SELECT 'с', 'R'
)

,vt2 as
(Select 'а' as k1, 'S' as k2
UNION all SELECT 'б', 'D'
UNION all SELECT 'с', 'F'
UNION all SELECT 'д', 'G'
)

SELECT
    t.k1, ifNULL(max(t.k2), '') || ifNULL(max(t.k3),'')
FROM
    (SELECT row_number() over(PARTITION by k1) as npp, k1, k2, null as k3 from vt1 as t1
    UNION ALL SELECT row_number() over(PARTITION by k1) as npp, k1, null, k2 as k3 from vt2 as t1
    ) as t
GROUP by
    t.k1, t.npp
31 Новичок_1С
 
31.01.23
12:07
(29) Запрос для отчета в СКД. Сначала подготавливаю таблицы, потом запрос в компоновку. Почистить после дубли в коде компоновки не совсем простая задача.
32 DexterMorgan
 
31.01.23
12:23
Можно пронумеровать таблицы и соединить по полю-номеру, но нужно понимать по какому полю их отсортировать для нумерации
33 Новичок_1С
 
31.01.23
12:26
(28) Посмотри на решение (6) Там не автономерзаписи. Там нумерация записи в пределах значения от первого поля.
34 Donkey_hot
 
31.01.23
12:28
(31) (31) Набор данных - объект, как вариант.
35 DexterMorgan
 
31.01.23
12:34
ВЫБРАТЬ
    "Q" КАК Поле1
ПОМЕСТИТЬ ВременнаяТаблица1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "W"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "R"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "A" КАК Поле2
ПОМЕСТИТЬ ВременнаяТаблица2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "S"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "D"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблица1.Поле1 КАК Поле1,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВременнаяТаблица11.Поле1) КАК Номер
ПОМЕСТИТЬ ВременнаяТаблица1Сортировка
ИЗ
    ВременнаяТаблица1 КАК ВременнаяТаблица1
        ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблица1 КАК ВременнаяТаблица11
        ПО ВременнаяТаблица1.Поле1 <= ВременнаяТаблица11.Поле1

СГРУППИРОВАТЬ ПО
    ВременнаяТаблица1.Поле1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблица2.Поле2 КАК Поле2,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВременнаяТаблица22.Поле2) КАК Номер
ПОМЕСТИТЬ ВременнаяТаблица2Сортировка
ИЗ
    ВременнаяТаблица2 КАК ВременнаяТаблица2
        ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблица2 КАК ВременнаяТаблица22
        ПО ВременнаяТаблица2.Поле2 <= ВременнаяТаблица22.Поле2

СГРУППИРОВАТЬ ПО
    ВременнаяТаблица2.Поле2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблица1Сортировка.Номер КАК Номер,
    ВременнаяТаблица1Сортировка.Поле1 КАК Поле1,
    ВременнаяТаблица2Сортировка.Поле2 КАК Поле2
ИЗ
    ВременнаяТаблица2Сортировка КАК ВременнаяТаблица2Сортировка
        ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблица1Сортировка КАК ВременнаяТаблица1Сортировка
        ПО (ВременнаяТаблица1Сортировка.Номер = ВременнаяТаблица2Сортировка.Номер)
36 DexterMorgan
 
31.01.23
12:35
Но опять, не понятно, почему у тебя в таблице идет Q W E, либо там номер строки, либо кластерный индекс, должно быть поле сортировки
37 Said_We
 
31.01.23
12:38
(33) "нумерация записи в пределах значения от первого поля" - и в чем проблема?
38 magicSan
 
31.01.23
13:32
ВЫБРАТЬ
    "а" КАК поле1,
    "S" КАК поле2
ПОМЕСТИТЬ таб1

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "б",
    "D"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "с",
    "F"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "д",
    "G"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "а" КАК поле1,
    "Q" КАК поле2
ПОМЕСТИТЬ таб

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "а",
    "W"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "б",
    "E"

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    "с",
    "R"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    таб.поле1 КАК поле1,
    таб.поле2 КАК поле2,
    КОЛИЧЕСТВО(таб_.поле1) КАК номер
ПОМЕСТИТЬ таб3
ИЗ
    таб КАК таб
        ЛЕВОЕ СОЕДИНЕНИЕ таб КАК таб_
        ПО таб.поле1 = таб_.поле1
            И таб.поле2 > таб_.поле2

СГРУППИРОВАТЬ ПО
    таб.поле1,
    таб.поле2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    таб.поле1 КАК поле1,
    таб.поле2 КАК поле2,
    КОЛИЧЕСТВО(таб_.поле1) КАК номер
ПОМЕСТИТЬ таб4
ИЗ
    таб1 КАК таб
        ЛЕВОЕ СОЕДИНЕНИЕ таб1 КАК таб_
        ПО таб.поле1 = таб_.поле1
            И таб.поле2 > таб_.поле2

СГРУППИРОВАТЬ ПО
    таб.поле1,
    таб.поле2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблица.поле1 КАК поле1,
    ВременнаяТаблица.номер КАК номер
ПОМЕСТИТЬ почти
ИЗ
    (ВЫБРАТЬ
        таб3.поле1 КАК поле1,
        таб3.номер КАК номер
    ИЗ
        таб3 КАК таб3
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        таб4.поле1,
        таб4.номер
    ИЗ
        таб4 КАК таб4) КАК ВременнаяТаблица

СГРУППИРОВАТЬ ПО
    ВременнаяТаблица.поле1,
    ВременнаяТаблица.номер
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    почти.поле1 КАК поле1,
    таб3.поле2 КАК поле2,
    таб4.поле2 КАК поле21
ИЗ
    почти КАК почти
        ЛЕВОЕ СОЕДИНЕНИЕ таб3 КАК таб3
        ПО (почти.поле1 = таб3.поле1
                И почти.номер = таб3.номер)
        ЛЕВОЕ СОЕДИНЕНИЕ таб4 КАК таб4
        ПО (почти.поле1 = таб4.поле1
                И почти.номер = таб4.номер)
39 uPstart_
 
31.01.23
13:37
ВЫБРАТЬ
    "a" КАК Поле1,
    "Q" КАК Поле2
ПОМЕСТИТЬ ВТ1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "a",
    "W"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "б",
    "E"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "с",
    "R"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "a" КАК Поле1,
    "S" КАК Поле2
ПОМЕСТИТЬ ВТ2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "б",
    "D"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "с",
    "F"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    "д",
    "G"
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ1.Поле1 КАК Поле1,
    ВТ1.Поле2 КАК Поле2,
    АВТОНОМЕРЗАПИСИ() КАК Поле3
ПОМЕСТИТЬ ВременнаяТаблица1
ИЗ
    ВТ1 КАК ВТ1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ2.Поле1 КАК Поле1,
    ВТ2.Поле2 КАК Поле2,
    АВТОНОМЕРЗАПИСИ() КАК Поле3
ПОМЕСТИТЬ ВременнаяТаблица2
ИЗ
    ВТ2 КАК ВТ2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблица1.Поле1 КАК Поле1,
    ВременнаяТаблица1.Поле2 КАК Поле2,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВременнаяТаблица11.Поле3) КАК Поле3
ПОМЕСТИТЬ ВТ_Т1
ИЗ
    ВременнаяТаблица1 КАК ВременнаяТаблица1
        ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблица1 КАК ВременнаяТаблица11
        ПО ВременнаяТаблица1.Поле1 = ВременнаяТаблица11.Поле1
            И ВременнаяТаблица1.Поле3 >= ВременнаяТаблица11.Поле3

СГРУППИРОВАТЬ ПО
    ВременнаяТаблица1.Поле1,
    ВременнаяТаблица1.Поле2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблица2.Поле1 КАК Поле1,
    ВременнаяТаблица2.Поле2 КАК Поле2,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВременнаяТаблица21.Поле3) КАК Поле3
ПОМЕСТИТЬ ВТ_Т2
ИЗ
    ВременнаяТаблица2 КАК ВременнаяТаблица2
        ЛЕВОЕ СОЕДИНЕНИЕ ВременнаяТаблица2 КАК ВременнаяТаблица21
        ПО ВременнаяТаблица2.Поле1 = ВременнаяТаблица21.Поле1
            И ВременнаяТаблица2.Поле3 >= ВременнаяТаблица21.Поле3

СГРУППИРОВАТЬ ПО
    ВременнаяТаблица2.Поле1,
    ВременнаяТаблица2.Поле2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕСТЬNULL(ВТ_Т1.Поле1, ВТ_Т2.Поле1) КАК Поле1,
    ВТ_Т1.Поле2 КАК Поле2,
    ВТ_Т2.Поле2 КАК Поле3
ИЗ
    ВТ_Т1 КАК ВТ_Т1
        ПОЛНОЕ СОЕДИНЕНИЕ ВТ_Т2 КАК ВТ_Т2
        ПО (ВТ_Т1.Поле1 = ВТ_Т2.Поле1)
            И (ВТ_Т1.Поле3 = ВТ_Т2.Поле3)

УПОРЯДОЧИТЬ ПО
    Поле1
40 RomanYS
 
31.01.23
13:53
(39) вместо КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВременнаяТаблица11.Поле3) правильнее наверное ещё раз АВТОНОМЕРЗАПИСИ сделать с нужной сортировкой. Ну и синонимы полей конечно впечатляют)))
41 magicSan
 
31.01.23
13:58
(40) нет, у него уже там уникальные значения. Нормальные псевдонимы для программистов
42 uPstart_
 
31.01.23
14:04
(40) Писал на коленках во время обеда тут не до псевдонимов. КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВременнаяТаблица11.Поле3) необходимо для нумерация строк по Поле1.
43 uPstart_
 
31.01.23
14:11
(0) Рекомендую не пожалеть 600 руб https://uc1.1c.ru/course/zapros-1c/
44 АгентБезопасной Нацио
 
31.01.23
14:22
(0) нужно как тут? Свернуть наборы в таблице
45 Новичок_1С
 
31.01.23
14:58
Спасибо большое всем за подсказки, отдельное спасибо за идею реализации KJlag. Сделал по принципу (6), реализовал так (27), потому что конечный запрос обрабатывается СКД.