Имя: Пароль:
1C
1С v8
Как в 1С написать конструкцию следующего вида?
,
0 Said_We
 
21.12.16
16:46
Select
  A.A
,(Select Top 1
    B.A
  From B as B
  Where A.A = B.A
  Order by B.B) as B
From A as A
1 Said_We
 
21.12.16
16:48
Что-то грустно писать по два левых соединения что бы по периодам разбить и вытащить значения.
2 mkalimulin
 
21.12.16
16:48
У тебя второе поле результата - таблица?
3 Said_We
 
21.12.16
16:49
нет
Это одно значение.
В MS SQL такие конструкции работают.
4 Said_We
 
21.12.16
16:50
В ОРАКЛЕ наверняка тоже.
По моему это стандарт 92 или 95 года (могу конечно ошибаться).
5 Garykom
 
гуру
21.12.16
16:56
(1) Догадайся в какое кол-во "левых соединений" превращает интерпретатор sql движка изврат из (0) ?
6 mehfk
 
21.12.16
17:01
(0) Разработчики платформы еще не дошли до того места в Books Online где такая инструкция описана.
7 Said_We
 
21.12.16
17:08
(5) А что догадываться. Я попробовал написать стандартно через два левых соединения и через эту конструкцию на большом количестве строк в таблице.
Пробовал пару лет назад ещё на 7.7 на 1С++ на MS SQL и SQLLite. Результат на MS SQL и SQLLite немного разный, но в любом случае на 1-2 порядка быстрее будет конструкция в (0).
8 Said_We
 
21.12.16
17:12
(5) В Консоле MS SQL самостоятельно попробуйте.
Почему про 7.7 упомянул? В 7.7 периодические значения реквизитов всех справочников хранятся в одной таблице. Поэтому таблица огромная и тяжёлая. На ней хорошо видна разница в скорости выполнения.
9 Said_We
 
21.12.16
17:13
(6) Books Online - это что имеется ввиду?
10 Cool_Profi
 
21.12.16
17:14
(9) И этот человек жалуется, что в 1с что-то не реализовано, а вот в SQL...
11 Garykom
 
гуру
21.12.16
17:15
(7) "Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,)"

Просто конструкция из (0) в MS SQL и прочих выполняется более параллельно, начинает строить внешние "все сочетания" сразу как только выдается какой то результат от внутреннего подзапроса в скобках.

При последовательном выполнении в 1С с использованием к примеру ВТ общее время да будет больше, но при этом средняя нагрузка на систему меньше (другие процессы/сеансы/пользователи не так пострадают).
12 mehfk
 
21.12.16
17:15
13 Said_We
 
21.12.16
17:17
(10) Кто жалуется? Я спросил как это в 1С 8 запустить?
14 Cool_Profi
 
21.12.16
17:18
(13) Ну нет такого в языке запросов 1с
15 Said_We
 
21.12.16
17:23
(11) Не совсем понял что такое "более параллельно"? Чем-то напоминает "немножко беременна".

Кто говорит что таблица В в (0) не может быть ВТ с необходимым индексом по полю В?

"средняя нагрузка на систему меньше..."
Если запрос выполняется пару минут и пару секунд, то как от пары секунд пользователи сильнее пострадают? А именно такая разница парой получается. Чушь по моему какая-то.

(13) И кроме прямых запросов хитростей никаких нет?
16 Said_We
 
21.12.16
17:27
(12) А это... :-)
17 Fragster
 
гуру
21.12.16
17:29
Основная
левое соединение Таб По 1 В (Выбрать Первые 1 1 Из Таб Как ТабОтбор Где ТабОтбор.Поле = Основная.Поле Упорядочить По ТабОтбор.Ключ)
18 Said_We
 
21.12.16
17:32
(17) Ну что-то похожее. Завтра попробую.
19 Said_We
 
21.12.16
17:33
(17) Спасибо.
20 Fragster
 
гуру
21.12.16
17:34
возможно я накосячил и надо так:

Основная
левое соединение Таб По Таб.Ключ В (Выбрать Первые 1 ТабОтбор.Ключ Из Таб Как ТабОтбор Где ТабОтбор.Поле = Основная.Поле Упорядочить По ТабОтбор.Ключ)
21 Said_We
 
21.12.16
17:38
(20) Я суть понял. В РЛС такое часто используют.
Единственное никогда не видел упорядочить внутри этой конструкции. Вот это собственно и попробую.
22 rabbidX
 
21.12.16
17:39
(20) Это соединение с вложенным запросом? Некошерно же. И почему условия соединения самого вложенного запроса? Или я неправильно понял Ваш запрос?
23 rabbidX
 
21.12.16
17:41
+(22) через ВТ красивше.
24 Fragster
 
гуру
21.12.16
17:42
(21) первый вариант даст все записи из соединяемой таблицы, нужен второй
(22) нет, это вложенный запрос в условиях соединения
25 Fragster
 
гуру
21.12.16
17:42
(23) через ВТ медленнее
26 rabbidX
 
21.12.16
17:47
(0) из таблицы А в результрующую выборку должно попасть то же поле, которое прописано в соединении?
Тогда можно так
Выбрать
В.А,
Минимум(В.В)
Из В Как В
Где В.А в (Выбрать А.А Из А Как А)
Сгруппировать по В.А
27 rabbidX
 
21.12.16
17:50
(25) на больших индексированных таблицах может и не медленнее быть в теории.
28 Fragster
 
гуру
21.12.16
17:52
(27) на больших индексированных таблицах само создание временной таблицы убьет идею
29 Said_We
 
21.12.16
18:05
(26) Неа.
Результат совсем другой будет в запросах в (0) и в (26).
Даже по количеству строк. Строк должно быть столько сколько в А. В варианте (26) строк будет либо как в В либо меньше.

Я не зря в (1) написал про разбиение по периодам. Даты окончания периода может и не быть - т.е. действует до сих пор.
30 Said_We
 
21.12.16
18:58
(20) ДА!!!
Так работает.
Спасибо большое.
31 Said_We
 
21.12.16
19:11
Не (0) конечно, но и не два левых соединения, а одно.
32 mistеr
 
21.12.16
19:24
(14) Такое есть в языке СКД.
33 Said_We
 
22.12.16
01:18
(32) Пример есть?
34 Said_We
 
22.12.16
14:11
(32) Потерялся... UP
35 mistеr
 
22.12.16
14:16
(33) ВычислитьВыражение()
2 + 2 = 3.9999999999999999999999999999999...