Имя: Пароль:
1C
1С v8
Запрос соединение: ограничение количества записей
, ,
0 fjay69
 
30.07.21
12:35
Возможно ли ограничить количество записей, которые окажутся в итоговой таблице из правой таблицы?
Пусть имеем Таб1

Кол1
Знач

И Таб2

Кол1 Кол2
Знач 1111
Знач 2222

Если я укажу в запросе

из Таб1 левое соединение Таб2 по Таб1.Кол1 = Таб2.Кол2

то итоговая таблица будет

Кол1 Кол2
Знач 1111
Знач 2222

А можно ли, что если одной строке левой таблицы по условиям соединения соответствует несколько строк правой таблицы, в итоговую таблицу переносить, например, только одну (первую, соответствующую условиям соединения)?
1 polosov
 
30.07.21
12:36
(0) 1Сный язык запросов не умеет.
2 Asmody
 
30.07.21
12:39
(0) правильно "приготовить" правую таблицу? например, обеспечить уникальность по полям соединения
3 МихаилМ
 
30.07.21
12:40
можно. если удавться определить критерии первости
4 polosov
 
30.07.21
12:42
(0) Можно либо (2)  либо сгруппировать по какому-нибудь максимуму после соединения.
5 Said_We
 
30.07.21
12:44
(0)
"из Таб1 левое соединение Таб2 по Таб1.Кол1 = Таб2.Кол2"

Вернет наверное:
Кол1 Кол2
Знач NULL

Может так было изначально?
"из Таб1 левое соединение Таб2 по Таб1.Кол1 = Таб2.Кол1"
6 Малыш Джон
 
30.07.21
12:47
(0) если определишься для себя что значит "первая, соответствующая условиям соединения", то конечно можно
7 fjay69
 
30.07.21
12:50
Придумал хитрую схему:
1. Добавляем в Таб2 АвтоНомерЗаписи();
2. Соединяем Таб1 и Таб2 и группируем по автономеру (мин или макс)
3. Соединяем таблицу из п.2 с Таб2 по автономеру
8 Малыш Джон
 
30.07.21
12:52
(7) вот неделю назад только разбирали такой случай:

СКД - как вывести две таблицы рядом, то есть параллельно
9 fjay69
 
30.07.21
12:54
Хорошо. Всем спасибо!
10 Said_We
 
30.07.21
13:05
(7) Схема стандартная.
Когда будешь добавлять АвтоНомерЗаписи() не забудь что он бывает только во внутренней таблице и только с использованием ВЫБРАТЬ ПЕРВЫЕ ХХХХХХ
где ХХХХХХ очень большое число.
11 Said_We
 
30.07.21
13:06
Да и "УПОРЯДОЧИТЬ ПО" обязательно указать. :-)
12 Малыш Джон
 
30.07.21
13:08
(10)>> он бывает только во внутренней таблице и только с использованием ВЫБРАТЬ ПЕРВЫЕ ХХХХХХ

не во внутренней, а во временной и ПЕРВЫЕ - не обязательно использовать
13 Малыш Джон
 
30.07.21
13:09
(11) тоже нет
14 ptiz
 
30.07.21
13:10
Тогда уж в тему.
Почему такой запрос выдаёт две записи, а не одну?

ВЫБРАТЬ
    "Знач" КАК Кол1
ПОМЕСТИТЬ ТЗ1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    "Знач" КАК Кол1,
    1111 КАК Кол2
ПОМЕСТИТЬ ТЗ2

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

ВЫБРАТЬ
    "Знач",
    2222

;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТЗ1.Кол1 КАК Кол1,
    ТЗ2.Кол2 КАК Кол2
ИЗ
    ТЗ1 КАК ТЗ1
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ2 КАК ТЗ2
        ПО ТЗ1.Кол1 = ТЗ2.Кол1
ГДЕ
    (ТЗ2.Кол1, ТЗ2.Кол2) В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                ТЗ2.Кол1,
                ТЗ2.Кол2
            ИЗ
                ТЗ2 КАК ТЗ2
            ГДЕ
                ТЗ2.Кол1 = ТЗ1.Кол1)
15 ptiz
 
30.07.21
13:12
ВЫБРАТЬ ПЕРВЫЕ 1 - должен выдавать одну и ту же запись, но условие прокатывает для разных записей ТЗ2
16 Said_We
 
30.07.21
13:12
(12) "Внутренняя" - оговорился. Вы же поняли что я имею ввиду.
17 Малыш Джон
 
30.07.21
13:14
(14) у меня этот запрос одну запись выдает
18 ptiz
 
30.07.21
13:15
(17) Серверная база? У меня 2.
19 Малыш Джон
 
30.07.21
13:16
(18) это на файловой, сейчас на серверной попробую
20 Kassern
 
30.07.21
13:17
(14) у меня 1 запись в консоли запросов
21 Малыш Джон
 
30.07.21
13:18
(18) на серверной тоже 1 запись
8.3.17.2231
22 ptiz
 
30.07.21
13:18
8.2 - на файловой и серверной выдаёт 2 записи.
8.3 - одну :)
23 Малыш Джон
 
30.07.21
13:19
(22) ¯\_(ツ)_/¯
24 ptiz
 
30.07.21
13:20
В 8.1 - тоже одну.
1С такая непостоянная.
25 Kassern
 
30.07.21
13:21
(24) а временные таблицы в какой версии появились? Раньше же вложенные запросы только были
26 Said_We
 
30.07.21
13:21
(25) 8.1.15 по поему
27 Kassern
 
30.07.21
13:23
(22) сравните в скуле запросы в 8.2 и 8.3 и найдете причину
28 Said_We
 
30.07.21
13:23
(13) Да. Если Упорядочить По есть, то обязательно. Зачем такое ограничение - не знаю.
29 Малыш Джон
 
30.07.21
13:34
(28) если есть УПОРЯДОЧИТЬ ПО, то ПЕРВЫЕ обязательно, если нет - то нет
30 Малыш Джон
 
30.07.21
13:48
+(29) это к нумерации записей отношения не имеет, просто если размер временной таблицы не ограничен, то сортировать её нельзя
31 Said_We
 
30.07.21
14:35
(30) АвтоНомерЗаписи(), как правило, используют с сортировкой. Поэтому, косвенно имеет.
В чем острая необходимость в 1С АвтоНомерЗаписи() использовать только во временных таблицах?
32 ptiz
 
30.07.21
14:55
(27) Да, запросы разные.
8.2:

SELECT
T1._Q_000_F_000,
T2._Q_001_F_001
FROM #tt1 T1 WITH(NOLOCK)
INNER JOIN #tt2 T2 WITH(NOLOCK)
ON (T1._Q_000_F_000 = T2._Q_001_F_000)
WHERE EXISTS(SELECT TOP 1
1
FROM #tt2 T3 WITH(NOLOCK)
WHERE ((T3._Q_001_F_000 = T1._Q_000_F_000)) AND (T2._Q_001_F_000 = T3._Q_001_F_000) AND (T2._Q_001_F_001 = T3._Q_001_F_001))

8.3:
SELECT
T1._Q_000_F_000,
T2._Q_001_F_001
FROM #tt1 T1 WITH(NOLOCK)
INNER JOIN #tt2 T2 WITH(NOLOCK)
ON (T1._Q_000_F_000 = T2._Q_001_F_000)
WHERE EXISTS(SELECT
1
FROM (SELECT TOP 1
T4._Q_001_F_000 AS Q_002_F_000_,
T4._Q_001_F_001 AS Q_002_F_001_
FROM #tt2 T4 WITH(NOLOCK)
WHERE (T4._Q_001_F_000 = T1._Q_000_F_000)) T3
WHERE (T2._Q_001_F_000 = T3.Q_002_F_000_) AND (T2._Q_001_F_001 = T3.Q_002_F_001_))
Ошибка? Это не ошибка, это системная функция.