Имя: Пароль:
1C
1С v8
Как сделать "двойное" условие запросе для конструкции "В"?
0 ИС-2
 
naïve
27.05.13
16:39
Как написать такое двойное условие в запросе? Видел, что делали такие выражения, но не помню где

И, вообще, насколько правильно использовать условие в иерархии для связей?

ВТ_Док.Координата В ИЕРАРХИИ,
   ВТ_ВТ_Док.Организация   в
               (ВЫБРАТЬ
                   ВТ_Координаты.Координата,
               ВТ_Координаты.Организация    
               ИЗ
                   ВТ_Координаты КАК ВТ_Координаты)
1 mikecool
 
27.05.13
16:40
(ВТ_Док.Координата, ВТ_ВТ_Док.Организация) В ИЕРАРХИИ
     
               (ВЫБРАТЬ
                   ВТ_Координаты.Координата,
               ВТ_Координаты.Организация    
               ИЗ
                   ВТ_Координаты КАК ВТ_Координаты)
2 mikecool
 
27.05.13
16:40
но имхо - не взлетит, проверять надо
3 ssh2012
 
27.05.13
16:42
(0) > насколько правильно использовать условие в иерархии для связей?

В условиях связей нельзя исп-ть В ИЕРАРХИИ
4 H A D G E H O G s
 
27.05.13
16:43
В ИЕРАРХИИ использовать не правильно.
И, как показала недавняя эмпирика,

(Таблица1.Значение1, Таблица1.Значение2) В

     
               (ВЫБРАТЬ
                   Таблица2.Значение1,
               Таблица2.Значение2
               ИЗ
                   Таблица2 КАК Таблица2)

Тоже не гуд.
5 H A D G E H O G s
 
27.05.13
16:43
(4) Лучше ВНУТРЕННЕЕ СОЕНИДЕНИЕ.
6 mikecool
 
27.05.13
16:44
(4) а чт оза эмпирика получилась?
7 H A D G E H O G s
 
27.05.13
16:45
8 acsent
 
27.05.13
16:47
(5) так это и есть внутреннее соединение, разве нет?
9 mikecool
 
27.05.13
16:48
(8) судя по всему - нет
10 ИС-2
 
naïve
27.05.13
16:54
(3) тоже так думаю. Но пока буду
(4) спасибо
(5) дык не получается сделать. Надо
ВТ_Док.Координата в иерархии(ВТ_Координаты.Координата)

такую конструкцию тоже не хочет
ВЫБОР
   КОГДА ИСТИНА В
           (ВЫБРАТЬ
               ВТ_3_КоординатаОрганизация.ЕстьЗапись
           ИЗ
               ВТ_3_КоординатаОрганизация КАК ВТ_3_КоординатаОрганизация)
       ТОГДА ЛОЖЬ
   ИНАЧЕ (ВТ_Док.Координата, ВТ_Док.Организация) В иерархии
               (ВЫБРАТЬ
                   ВТ_Координаты.Координата,
                   ВТ_Координаты.Организация
               ИЗ
                   ВТ_Координаты КАК ВТ_Координаты)
           И ВТ_Координаты.Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
КОНЕЦ
11 Sorm
 
27.05.13
16:56
(0) Временная таблица и джойн. Особенно в нагруженных системах, массовых запросах.
12 ИС-2
 
naïve
27.05.13
17:16
выше
13 Fragster
 
гуру
27.05.13
17:20
а что в (7) решили? что 100%? получается RLS всегда фуллскан, чтоли?
14 Fragster
 
гуру
27.05.13
17:21
а, не, я тупой после инфостарта что-то
15 Serginio1
 
27.05.13
17:23
(4) Можно по другому пойти

(Таблица1.Значение1) В

     
               (ВЫБРАТЬ
                   Таблица2.Значение1
               
               ИЗ
                   Таблица2 КАК Таблица2
               Где Таблица2.Значение2=Таблица1.Значение2)

Желательно, что бы Значение2 было индексировано
16 ИС-2
 
naïve
27.05.13
17:28
(15) только Таблица1.Значение2 не содержиться в этой выборке
17 Serginio1
 
27.05.13
17:29
v8: Подзапросы с Выбрать Первые
приходилось отбирать во временную таблицу а затем индексировать. Правда в последующих версиях нельзя использовать кортеж из двух и более если есть поля первой таблицы в условиях

Выбрать * Из Таблица как таблица
Где (Объект, СчетФактура) В (Выбрать первые 1 док.Объект,док.Счетфактура из ИЗ
                       Документ КАК Док
                   ГДЕ
                       Док.Ссылка = ТаблицаВЗапросе.Ссылка
                   УПОРЯДОЧИТЬ ПО
                       НужныеПля)


Это проходило в
v8: Подзапросы с Выбрать Первые

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

"Недопустимо использовать упорядочивание внутри запроса, вложенного в операцию В с множественными операндами, если есть обращения к полям внешнего запроса"

v8: запрос. найти посл. поступление!
Иможно использовать только

ВЫБРАТЬ
   втИндекс.Ссылка КАК Ссылка,
   втИндекс.Номенлатура КАК Номенлатура
ИЗ
   втИндекс КАК втИндекс
ГДЕ
   (втИндекс.Ссылка) В


         (ВЫБРАТЬ ПЕРВЫЕ 1
              док.Ссылка
           ИЗ
               втИндексКАК Док
           ГДЕ
          Док.Номенклатура=втИндекс.Номенлатура
           УПОРЯДОЧИТЬ ПО
               Док.Дата УБЫВ
               ,Док.Ссылка)

УПОРЯДОЧИТЬ ПО
   МоментВремени
18 Serginio1
 
27.05.13
17:32
19 Fragster
 
гуру
27.05.13
17:34
(17)(18) да, так работает, но медленновато
20 Fragster
 
гуру
27.05.13
17:34
даже с индексом получаем фулскан основной + 100500 индекс сиков по индексированной вложенной
21 Serginio1
 
27.05.13
17:51
(20) Не знаю. У меня очень быстро работало на таблицах с 4 млн. записей. Там получался такой запросс

ВЫБРАТЬ
   втИндекс.Ссылка КАК Ссылка,
   втИндекс.Номенлатура КАК Номенлатура
ИЗ
   втИндекс КАК втИндекс
ГДЕ
   (втИндекс.Ссылка) В



        (ВЫБРАТЬ ПЕРВЫЕ 1
              док.Ссылка
           ИЗ
               втИндексКАК Док
           ГДЕ
          Док.Номенклатура=втИндекс.Номенлатура
           УПОРЯДОЧИТЬ ПО
               Док.Дата УБЫВ
               ,Док.Ссылка)

УПОРЯДОЧИТЬ ПО
   МоментВремени

Где BT была упорядочена по Ссылка,Номенклатура,Дата
22 Serginio1
 
27.05.13
17:53
Вернее проиндексировано
23 Fragster
 
гуру
27.05.13
17:55
(21) а план что показывал? у меня на классическом примере с курсом валют (правда "первые 2")
вот так:
wstaw.org/m/2013/05/16/0.png
24 Serginio1
 
27.05.13
18:01
(23) Честно не смотрел. Просто в той ж v8: Подзапросы с Выбрать Первые
там индексирование временной таблицы давало огромный эффект.
Мне нужно было найти прайс с минимальной ценой и максимальном количеством остатков (может быть несколько прайсов с одинаковой ценой).
То есть в 21 это временная таблица проиндексированная по нужным полям.
25 Serginio1
 
27.05.13
18:02
26 Fragster
 
гуру
27.05.13
18:16
(25) а план-то где?
27 Serginio1
 
27.05.13
18:26
(26) А не делал. Мне интересно было заставить быстро работать. Там генерация запроса.
У меня свой план в голове.
28 Fragster
 
гуру
27.05.13
18:28
(27) 0,1 и 0,01 визуально работают практически одинаково, но нагрузку дают разную и когда народу много - очень разные порой артефакты вылезают
29 Fragster
 
гуру
27.05.13
18:28
0.1 и 0.01 секунды
30 Serginio1
 
27.05.13
18:28
Я вот одного не пойму почему они EXISTS не введут.Вроде как стандарт SQL.
31 Fragster
 
гуру
27.05.13
18:29
(30) не SQl, а T-SQL - мелкософтовского диалекта
32 Serginio1
 
27.05.13
18:34
33 Fragster
 
гуру
27.05.13
18:40
(32) ну тогда может посчитали, что Где 1 в (выбрать первые 1) достаточно. тем более, что они сами на эксистс частенько заменяют язык запросов 1с, например для (поле 1, поле2) в (выбрать...)
34 Serginio1
 
27.05.13
18:44
(33) Там же v8: Подзапросы с Выбрать Первые
40,41
Вариант



WHERE
EXISTS(
SELECT

CAST(1 AS NUMERIC(1,0)) AS f_1
FROM
(
SELECT TOP 1
#Te85f61ac690c437aaf9abb367656dabb_Q_002_T_001._Q_000_F_000RRef AS _Q_002_F_000RRef,
#Te85f61ac690c437aaf9abb367656dabb_Q_002_T_001._Q_000_F_001 AS _Q_002_F_001
FROM
#tt7 #Te85f61ac690c437aaf9abb367656dabb_Q_002_T_001 WITH(NOLOCK)

WHERE
#Te85f61ac690c437aaf9abb367656dabb_Q_002_T_001._Q_000_F_000RRef = #Te85f61ac690c437aaf9abb367656dabb_Q_001_T_001._Q_000_F_000RRef

ORDER BY
#Te85f61ac690c437aaf9abb367656dabb_Q_002_T_001._Q_000_F_003 DESC,

#Te85f61ac690c437aaf9abb367656dabb_Q_002_T_001._Q_000_F_004 DESC

) #V8TblAli1

WHERE
#Te85f61ac690c437aaf9abb367656dabb_Q_001_T_001._Q_000_F_000RRef = #V8TblAli1._Q_002_F_000RRef AND #Te85f61ac690c437aaf9abb367656dabb_Q_001_T_001._Q_000_F_001 = #V8TblAli1._Q_002_F_001)
35 Serginio1
 
27.05.13
18:58
Мало того например используя в в 7 ке 1С++ я могу добавить в текст запроса отсебятину, которая прекрасно проходит.

Declare @ЗаказНаФабрику as char(9);
SELECT @ЗаказНаФабрику=Журнал7.IDDOC FROM _1SJOURN AS Журнал7 With (NOLOCK) WHERE (Журнал7.IDDOCDEF = 2742) AND (Журнал7.DOCNO = 'РГ07814');

SELECT *
FROM $Регистр.Тест AS Тест
WHERE (Тест.DEBKRED=1) and AND  ($Тест.ЗаказНаФабрику = @ЗаказНаФабрику)