Имя: Пароль:
1C
1С v8
Можно ли сделать в запросе не соединение таблиц а исключение ?
0 Taiska
 
20.12.13
19:24
Можно ли сделать в запросе не соединение таблиц а исключение ?
1 bolobol
 
20.12.13
19:24
Можно
2 Taiska
 
20.12.13
19:25
т.е. по одному запросу надо выбрать все заказы, а по второму выбрать заказы которые надо исключить из первого... соединение по заказу, но надо не соединение сделать а исключение.
3 Taiska
 
20.12.13
19:26
как ?
4 mehfk
 
20.12.13
19:26
CROSS JOIN ON ...
Where Tab1.<> is null or Tab2.<> is NULL
5 bolobol
 
20.12.13
19:26
Соединение надо, левое. В условиях указать, что там где из правой части = null - эти записи и нужны
6 mehfk
 
20.12.13
19:27
(2) Надо выбрать те записи из таблицы 2 которых нет в таблице 1, верно?
7 mehfk
 
20.12.13
19:28
(5) Если нужно как в (6) то правое
8 bolobol
 
20.12.13
19:28
Выбрать ЗаказыВсе.Заказ
ИЗ
ЗаказыВсе КАК ЗаказыВсе
Левое соединение
ЗаказыИсключаемые КАК ЗаказыИсключаемые
по
ЗаказыВсе.Заказ = ЗаказыИсключаемые.Заказ
ГДЕ ЗаказыИсключаемые.Заказ есть null
9 Taiska
 
20.12.13
19:32
(6)нет надо из первой таблицы вычесть вторую... т.е. выбираем заказы в первой а во второй выбираем те заказы которые надо исключить из первой.и из первой удаляем выбранные во второй заказы.
10 Taiska
 
20.12.13
19:33
т.е. в первой изначально присутствуют заказы которые и во второй, но узнав во второй которые надо исключить исключаем их из первой.
11 Taiska
 
20.12.13
19:34
(8) спасибо...щас попробую
12 Taiska
 
20.12.13
19:36
ГДЕ ЗаказыИсключаемые.Заказ есть null это выражение убирает разьве вторые заказы из 1ой таблицы ?? это же провверка условия, а не присвоение нулевого значения ?
13 mehfk
 
20.12.13
19:39
(9) Таб1, которых нет в Таб2 ?
14 Taiska
 
20.12.13
19:43
наверно так(13)
15 Taiska
 
20.12.13
19:43
в таб 1 есть изначально и те заказазы которые в таб 2. т.е. в таб 1 к примеру 100 строк а в таб 2 - 50.. и надо из таб 1 из 100 строк вычесть 50 которые в таб2..чтобы в таб 1 осталось 50
16 mehfk
 
20.12.13
19:50
(15) Ты запутал(а) всех
ТАб1
1
2
3
4
5

Таб2
3
4
5
6

Что должно получиться?
17 Taiska
 
20.12.13
19:52
должно получиться 12
18 Taiska
 
20.12.13
19:53
6 позиция нам не нужна из 2ой таблицы
19 mehfk
 
20.12.13
19:53
Может быть
1
2


???
20 Taiska
 
20.12.13
19:53
нужно только 1 и 2
21 mehfk
 
20.12.13
19:54
или
1
2
3
4
5
22 Taiska
 
20.12.13
19:54
(19)ну да 1 и 2,
23 Taiska
 
20.12.13
19:54
1 и 2 только
24 Taiska
 
20.12.13
19:54
как это сделать ?(((( замучалась уже
25 mehfk
 
20.12.13
19:55
select
tab1.id,
tab2.id
from tab1
left join
tab2
on
tab1.id = tab2.id
where tab2.id is null
26 mehfk
 
20.12.13
19:59
Или так
select
Tab3
From
(select
tab1.id as id1,
tab2.id as id2
from tab1
left join
tab2
on
tab1.id = tab2.id) As Tab3
Where Tab3.id2 is null
27 mehfk
 
20.12.13
19:59
select
Tab3
=>
select
*
28 Taiska
 
20.12.13
20:24
спасибо... но у меня еще на первую и вторую таблицу накладыватся условия
29 Taiska
 
20.12.13
20:25
ВЫБРАТЬ
            //РасчетыСКлиентамиОстатки.СуммаОстаток КАК СуммаОстаток,
        //РасчетыСКлиентамиОстатки.КОплатеОстаток КАК КОплатеОстаток,
        //РасчетыСКлиентамиОстатки.КОтгрузкеОстаток КАК КОтгрузкеОстаток,
        
            //    РасчетыСКлиентамиОстатки.ЗаказКлиента КАК ЗаказКлиента
            РасчетыСКлиентами.Период КАК Период,
            РасчетыСКлиентами.Регистратор КАК Регистратор,
            РасчетыСКлиентами.Сумма КАК Сумма,
            РасчетыСКлиентами.КОплате КАК КОплате,
            РасчетыСКлиентами.КОтгрузке КАК КОтгрузке
            
            
            
        ИЗ  РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами

Левое СОЕДИНЕНИЕ  ( выбрать РасчетыСКлиентамиОстатки.ЗаказКлиента КАК ЗаказКлиента
                       ГДЕ РасчетыСКлиентамиОстатки.СуммаОстаток > 0

            из РегистрНакопления.РасчетыСКлиентами.Остатки КАК РасчетыСКлиентамиОстатки ) как вложенныйзапрос
                            ПО РасчетыСКлиентами.ЗаказКлиента = вложенныйзапрос.ЗаказКлиента
где РасчетыСКлиентамиОстатки.ЗаказКлиента = NULL
30 mehfk
 
20.12.13
20:33
а кто вам мешает сделать, например, так
select
...
from
(select
...
from tab1
where...) as tab1
left join
(select
...
from tab2
where...) as tab2
on
(...)
left join (....)
31 mehfk
 
20.12.13
20:34
последняя строчка лишняя,
замените на where tab2. is null
32 toypaul
 
гуру
20.12.13
20:39
33 Taiska
 
20.12.13
20:45
(31) спасибо))
34 Taiska
 
20.12.13
20:50
он выдает теперь пустые строки - просто удалил оттуда заказ а строка осталась во дела... а как строки то эти удалить ?
35 mehfk
 
20.12.13
20:51
(33) Чтобы лучше представлять себе виды соедниений (JOIN) нарисуйте два облачка (множества) и потреннируйтесь эти два облачка (множества) объединять и вычитать. Если мне не изменяет память, в вики есть примеры на эту тему.
36 Taiska
 
20.12.13
21:00
спасибо всем за помощь и внимание уделенное. у меня получилось вот так:
|выбрать РасчетыСКлиентами.Регистратор.ЗаказКлиента КАК ЗАКАЗКЛИЕНТА,
|РасчетыСКлиентами.Период КАК Период,
|РасчетыСКлиентами.Сумма КАК Сумма,
|РасчетыСКлиентами.КОплате КАК КОплате,
|РасчетыСКлиентами.КОтгрузке КАК КОтгрузке
|
|ИЗ  РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
|ГДЕ не РасчетыСКлиентами.Регистратор.ЗаказКлиента.ссылка в  
|
|(ВЫБРАТЬ
|РасчетыСКлиентамиОстатки.ЗаказКлиента ИЗ
|РегистрНакопления.РасчетыСКлиентами.Остатки КАК РасчетыСКлиентамиОстатки
|ГДЕ
|РасчетыСКлиентамиОстатки.СуммаОстаток >0)
|Упорядочить по Период
37 Kvestin
 
20.12.13
21:41
Будет работать не оптимально. Не забудьте про временные таблицы и ограничение виртуальных таблиц :)
38 Feunoir
 
20.12.13
21:48
Кокой кошмар.

Либо это НЕ В (...), либо ТС не умеет формулировать вопросы.

Впрочем, я уже встречал людей с сертификатом по платформе, которые ничего, на самом деле, в 1С не понимали.
39 mehfk
 
20.12.13
21:53
(38) ...НЕ В... на больших объемах есть бОльшая вероятность получить неоптимальный план запроса чем с JOIN
40 Kvestin
 
20.12.13
21:56
Это еще не кошмар.
Как вам такой вариант:

    |ИЗ
    |    РегистрСведений.СписанныеТовары КАК СписанныеТовары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровПереданные.Остатки(&Дат,    
    |                                                                                    Номенклатура В
    |                                                                                        (ВЫБРАТЬ
    |                                                                                            РегистрСведений.СписанныеТовары.Номенклатура
    |                                                                                        ИЗ
    |                                                                                            РегистрСведений.СписанныеТовары
    |                                                                                        ГДЕ
    |                                                                                            РегистрСведений.СписанныеТовары.Регистратор = &Ссылка)" +
                                                                                        ?(ДоговорКонтрагента = Неопределено, "", "
    |                                                                                         И ДоговорКонтрагента = &ДоговорКонтрагента") + "
    |                                                                                ) КАК ПартииТоваровПереданные
41 Kvestin
 
20.12.13
21:58
Когда это увидел в стандартной УТ - был в шоке. Подумал, что база старая и потом все поправили.
Открыл УПП 1.3 и увидел тот же запрос.
Если 1С себе такое позволяет, то это либо закладки для оптимизации или непрофессионализм чистой воды.
42 Taiska
 
20.12.13
23:14
объединением с присвоением NULL  у меня не получилоь получилось много строк но пустых... они не удалились а просто стали пустыми... поэтому пришлось способом не в
43 Taiska
 
20.12.13
23:14
тоже его нашла в какой то теме.
44 Torquader
 
20.12.13
23:48
(42) Вообще, в нормальном SQL это делается выбором из первой таблицы во временную и удалением из временной по выбору из второй - для SQL оптимальная производительность (если ключевые поля правильно выбрать).
Но, есть и "грабли" - например, если в первой таблице две одинаковых строки, а во-второй - только одна.
P.S. как бы хотелось, чтобы можно было применять DELETE ко временным таблицам.
45 selenat
 
21.12.13
09:42
Ну тогда по мотивам этого обсуждения
http://www.forum.mista.ru/mytopics.php?user_id=11484
могу предложить не левое соединение, а объединение с последующей группировкой и исключением лишнего. Предполагаю, что по скорости это будет оптимальный вариант. Пример замены левого соединения на этот вариант выкладывал в той ветке.
46 selenat
 
21.12.13
10:06
Ошибся с ссылкой в (45). Ссылка такая
v8: Индексы в запросах.
47 selenat
 
21.12.13
10:16
Что-то вроде этого получится:

ВЫБРАТЬ
    ВложенныйЗапрос.Заказ,
    СУММА(ВложенныйЗапрос.СлужебноеПоле) КАК СлужебноеПоле
ИЗ
    (ВЫБРАТЬ
        Таб1.Заказ КАК Заказ,
        0 КАК СлужебноеПоле
    ИЗ
        Таб1 КАК Таб1
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        Таб2.Заказ,
        1
    ИЗ
        Таб2 КАК Таб2) КАК ВложенныйЗапрос

СГРУППИРОВАТЬ ПО
    ВложенныйЗапрос.Заказ

ИМЕЮЩИЕ
    СУММА(ВложенныйЗапрос.СлужебноеПоле) = 0
48 mzelensky
 
21.12.13
12:09
(0) Ты получила сертификат "СПЕЦА" и задаешь ТАКИЕ ВОПРОСЫ???
49 EvgeniuXP
 
21.12.13
13:39
(48) обычная практика - корочкам никто уже не верит.
50 МихаилМ
 
21.12.13
13:43
(48)
Вы получили "красный" диплом в институте ?
51 Torquader
 
21.12.13
19:44
(48) Нет, а что тебе не нравится - задан конкретный вопрос.
Если бы "СПЕЦА" не было, было бы "Как выбрать что-то оттуда, откуда не знаю, и что с этим потом делать".