Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Запрос соединение: ограничение количества записей

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

Кол1
Знач

И Таб2

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

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

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

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

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

А можно ли, что если одной строке левой таблицы по условиям соединения соответствует несколько строк правой таблицы, в итоговую таблицу переносить, например, только одну (первую, соответствующую условиям соединения)?
   polosov
 
1 - 30.07.21 - 12:36
(0) 1Сный язык запросов не умеет.
   Asmody
 
2 - 30.07.21 - 12:39
(0) правильно "приготовить" правую таблицу? например, обеспечить уникальность по полям соединения
   МихаилМ
 
3 - 30.07.21 - 12:40
можно. если удавться определить критерии первости
   polosov
 
4 - 30.07.21 - 12:42
(0) Можно либо (2)  либо сгруппировать по какому-нибудь максимуму после соединения.
   Said_We
 
5 - 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) если определишься для себя что значит "первая, соответствующая условиям соединения", то конечно можно
   fjay69
 
7 - 30.07.21 - 12:50
Придумал хитрую схему:
1. Добавляем в Таб2 АвтоНомерЗаписи();
2. Соединяем Таб1 и Таб2 и группируем по автономеру (мин или макс)
3. Соединяем таблицу из п.2 с Таб2 по автономеру
   Малыш Джон
 
8 - 30.07.21 - 12:52
(7) вот неделю назад только разбирали такой случай:

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

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.