| 
    
            
         
         | 
    
  | 
Запрос. Внутреннее соединенние не могу настроить связь | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        scanduta    
     22.02.13 
            ✎
    18:53 
 | 
         
        вот картинка там все есть http://s1.ipicture.ru/uploads/20130222/eDJwRSuv.jpg
  
        не пойму почему запись строка которая выделена и еще пару строк под ней попадают в запрос . свзяь я вроде верное поставил. Помогите а то я че т не пойму. Может по другому свзяь сделать  | 
|||
| 
    1
    
        scanduta    
     22.02.13 
            ✎
    19:02 
 | 
         
        не много ни так написал, уточню:
  
        по задумке выделенная строка и еще пара строк под ней должны попадать в выборку.. А вот почему остальные попадают, хотя условию они не соотвествуют  | 
|||
| 
    2
    
        GANR    
     22.02.13 
            ✎
    19:29 
 | 
         
        (1) Периоды не должны пересекаться - такое ДОЛЖНО быть условие?     
         | 
|||
| 
    3
    
        scanduta    
     22.02.13 
            ✎
    20:00 
 | 
         
        (2) да все правильно вы поняли. как же мне это реализовать?     
         | 
|||
| 
    4
    
        Vesa    
     22.02.13 
            ✎
    20:21 
 | 
         
        Какая конкретно строка не должна попадать?     
         | 
|||
| 
    5
    
        scanduta    
     22.02.13 
            ✎
    20:30 
 | 
         
        Должны остаться только те строки таблицы ВТ3 дапазоны дат которы не пересекаются с диапазонами таблицы остатки     
         | 
|||
| 
    6
    
        scanduta    
     22.02.13 
            ✎
    20:31 
 | 
         
        то есть по сути должны остаться выделенная строка, и 2 строки которые прямо под ней     
         | 
|||
| 
    7
    
        GANR    
     22.02.13 
            ✎
    20:38 
 | 
         
        Если исходить из предположения, что данные корректны и для каждой записи таблиц ВТ3 и Остатки выполняется условие
  
        ВТ3.ДатаНач < ВТ3.ДатаКон И Остатки.ДатаНач < Остатки.ДатаКон то условие соединения может выглядеть так ВТ3.ДатаКон < Остатки.ДатаНач ИЛИ ВТ3.ДатаНач > Остатки.ДатаКон или нет?  | 
|||
| 
    8
    
        GANR    
     22.02.13 
            ✎
    20:40 
 | 
         
        Нарисуй на картинке область допустимых вариантов с 2-мя отрезками как в школе - должно стать ясно.     
         | 
|||
| 
    9
    
        scanduta    
     22.02.13 
            ✎
    20:49 
 | 
         
        (7) по предложенному вариант не взлетает 
  
        http://s2.ipicture.ru/uploads/20130222/MkJL436o.jpg  | 
|||
| 
    10
    
        scanduta    
     22.02.13 
            ✎
    20:50 
 | 
||||
| 
    11
    
        GANR    
     22.02.13 
            ✎
    20:53 
 | 
         
        (10) запрос в ветку     
         | 
|||
| 
    12
    
        scanduta    
     22.02.13 
            ✎
    20:56 
 | 
         
        Запрос я может усложинл слекга но вот он:
  
        ВЫБРАТЬ ЗаказыКлиентовОстаткиИОбороты.Период ПОМЕСТИТЬ ВТ ИЗ РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты( &НачПериода, &КонПериода, Запись, ДвиженияИГраницыПериода, ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт) ИЛИ ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке)) КАК ЗаказыКлиентовОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МакКоличетсвоУлсуг КАК МакКоличетсвоУлсуг ПО ЗаказыКлиентовОстаткиИОбороты.Номенклатура = МакКоличетсвоУлсуг.Услуга ГДЕ ЗаказыКлиентовОстаткиИОбороты.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ.Период КАК ДатаНачала, МИНИМУМ(ЗаказыКлиентовОстаткиИОбороты.Период) КАК ДатаЗАвершения ПОМЕСТИТЬ ВТ2 ИЗ ВТ КАК ВТ ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты( &НачПериода, &КонПериода, Запись, ДвиженияИГраницыПериода, ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт) ИЛИ ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке)) КАК ЗаказыКлиентовОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МакКоличетсвоУлсуг КАК МакКоличетсвоУлсуг ПО ЗаказыКлиентовОстаткиИОбороты.Номенклатура = МакКоличетсвоУлсуг.Услуга ПО ВТ.Период < ЗаказыКлиентовОстаткиИОбороты.Период ГДЕ ЗаказыКлиентовОстаткиИОбороты.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга) СГРУППИРОВАТЬ ПО ВТ.Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ.Период КАК ДатаНачала, МИНИМУМ(ЗаказыКлиентовОстаткиИОбороты.Период) КАК ДатаЗАвершения, ЗаказыКлиентовОстаткиИОбороты.Номенклатура ПОМЕСТИТЬ ВТ3 ИЗ ВТ КАК ВТ ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты( &НачПериода, &КонПериода, Запись, ДвиженияИГраницыПериода, ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт) ИЛИ ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке)) КАК ЗаказыКлиентовОстаткиИОбороты ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МакКоличетсвоУлсуг КАК МакКоличетсвоУлсуг ПО ЗаказыКлиентовОстаткиИОбороты.Номенклатура = МакКоличетсвоУлсуг.Услуга ПО ВТ.Период < ЗаказыКлиентовОстаткиИОбороты.Период ГДЕ ЗаказыКлиентовОстаткиИОбороты.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга) СГРУППИРОВАТЬ ПО ВТ.Период, ЗаказыКлиентовОстаткиИОбороты.Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ДОБАВИТЬКДАТЕ(ЗаказыКлиентовОстаткиИОбороты.Период, СЕКУНДА, 1) КАК ДатаНачала, ДОБАВИТЬКДАТЕ(ЗаказыКлиентовОстаткиИОбороты.Период, СЕКУНДА, МакКоличетсвоУлсуг.ВремяОказанияУслуги * 60 * ЕСТЬNULL(ЗаказыКлиентовОстаткиИОбороты.КОформлениюПриход, 0) - 1) КАК ДатаЗавершения ПОМЕСТИТЬ ОСТАТКИ ИЗ РегистрСведений.МакКоличетсвоУлсуг КАК МакКоличетсвоУлсуг, РегистрНакопления.ЗаказыКлиентов.ОстаткиИОбороты( &ДатаНач, , Запись, , ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт) ИЛИ ЗаказКлиента.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке)) КАК ЗаказыКлиентовОстаткиИОбороты ГДЕ ЗаказыКлиентовОстаткиИОбороты.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Услуга) СГРУППИРОВАТЬ ПО ДОБАВИТЬКДАТЕ(ЗаказыКлиентовОстаткиИОбороты.Период, СЕКУНДА, 1), ДОБАВИТЬКДАТЕ(ЗаказыКлиентовОстаткиИОбороты.Период, СЕКУНДА, МакКоличетсвоУлсуг.ВремяОказанияУслуги * 60 * ЕСТЬNULL(ЗаказыКлиентовОстаткиИОбороты.КОформлениюПриход, 0) - 1) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ3.ДатаНачала, ВТ3.ДатаЗАвершения ИЗ ВТ3 КАК ВТ3 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОСТАТКИ КАК ОСТАТКИ ПО (НЕ(ОСТАТКИ.ДатаНачала МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения ИЛИ ОСТАТКИ.ДатаЗавершения МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения)) СГРУППИРОВАТЬ ПО ВТ3.ДатаЗАвершения, ВТ3.ДатаНачала  | 
|||
| 
    13
    
        scanduta    
     22.02.13 
            ✎
    20:57 
 | 
         
        но важна вот эта часть разумеется 
  
        //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ3.ДатаНачала, ВТ3.ДатаЗАвершения ИЗ ВТ3 КАК ВТ3 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОСТАТКИ КАК ОСТАТКИ ПО (НЕ(ОСТАТКИ.ДатаНачала МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения ИЛИ ОСТАТКИ.ДатаЗавершения МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения)) СГРУППИРОВАТЬ ПО ВТ3.ДатаЗАвершения, ВТ3.ДатаНачала  | 
|||
| 
    14
    
        scanduta    
     22.02.13 
            ✎
    20:58 
 | 
         
        Причем когда мне надо выбрать диапазоны которые пересекаются я спокойно получаю это с помощью функции МЕЖДУ.
  
        А вот выбрать наоборот диапазоны без пересечения ну никак не получается  | 
|||
| 
    15
    
        GANR    
     22.02.13 
            ✎
    20:59 
 | 
         
        (10) Но вообще условию (7) в листинге (10) все соответствует, если внимательно присмотреться - либо остатки позже начались (строчка 1), либо раньше закончились (строчка 2)     
         | 
|||
| 
    16
    
        GANR    
     22.02.13 
            ✎
    21:00 
 | 
         
        ВНИМАТЕЛЬНО глянь листинг (10) - может, просто показалось, что неправильно.     
         | 
|||
| 
    17
    
        GANR    
     22.02.13 
            ✎
    21:01 
 | 
         
        (14) так надо с пересечениями?     
         | 
|||
| 
    18
    
        GenV    
     22.02.13 
            ✎
    21:01 
 | 
         
        (16)+1     
         | 
|||
| 
    19
    
        scanduta    
     22.02.13 
            ✎
    21:05 
 | 
         
        (16) нет не показалось ... посмотри диапазоны слева 01.05.13 с 00 00 00 до 08 00 00 справа нету диапазон попадающих в этот диапазон. Поэтому должны остатться только эт три записи.     
         | 
|||
| 
    20
    
        scanduta    
     22.02.13 
            ✎
    21:07 
 | 
         
        (17) с пересечениями не надо. Это получается у меня     
         | 
|||
| 
    21
    
        GenV    
     22.02.13 
            ✎
    21:07 
 | 
         
        (19) Ты сделал условие с НЕпопаданием в диапазон ...     
         | 
|||
| 
    22
    
        scanduta    
     22.02.13 
            ✎
    21:11 
 | 
         
        да но мне необходимо проверить чтобы в диапазон не попадали все записи из таблицы остатков а не частично     
         | 
|||
| 
    23
    
        EugeniaK    
     22.02.13 
            ✎
    21:11 
 | 
         
        Правильное условие
  
        ВТ3.ДатаКон < Остатки.ДатаНач И ВТ3.ДатаНач > Остатки.ДатаКон  | 
|||
| 
    24
    
        GANR    
     22.02.13 
            ✎
    21:12 
 | 
         
        (22) Аааа... Это совсем другой запрос должен быть. Вот это по делу!     
         | 
|||
| 
    25
    
        EugeniaK    
     22.02.13 
            ✎
    21:13 
 | 
         
        (23) Хотя нет, все-таки "ИЛИ"     
         | 
|||
| 
    26
    
        GANR    
     22.02.13 
            ✎
    21:14 
 | 
         
        (25) тут одним условием не ограничиться - тут вложенные запросы со свертками внутри будут иметь место     
         | 
|||
| 
    27
    
        scanduta    
     22.02.13 
            ✎
    21:19 
 | 
         
        Ладно наверное сегодня лучше голову не забивать...утро вечера мудренее... =) всем спасибо за помощь. Если больше я в теме не отпишусь то считайте что я разобрался... всех снаступающим  днем защитника отчечества     
         | 
|||
| 
    28
    
        GANR    
     22.02.13 
            ✎
    23:01 
 | 
         
        (27) Задача (22) решается в несколько этапов:
  
        1. Найти записи ВТ3, которые пересекаются с Остатками хотя бы один раз и выгрузить их в ВТ4 с ВЫБРАТЬ РАЗЛИЧНЫЕ условие внутреннего соединения таблиц Остатки и ВТ3 такое ОСТАТКИ.ДатаНачала МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения ИЛИ ОСТАТКИ.ДатаЗавершения МЕЖДУ ВТ3.ДатаНачала И ВТ3.ДатаЗАвершения 2. Выбрать из ВТ3 записи, которые НЕ попадают в п.1 (ВТ4) запросом ниже и выгрузить их в ВТ5 ВЫБРАТЬ а.ДатаНачала, а.ДатаЗавершения ИЗ ВТ3 КАК а ГДЕ НЕ (а.ДатаНачала, а.ДатаЗавершения) В (ВЫБРАТЬ б.ДатаНачала, б.ДатаЗавершения ИЗ ВТ4 КАК б) 3. Соединить записи п.2 (ВТ5) и Остатки ВНУТРЕННИМ СОЕДИНЕНИЕМ ПО (ИСТИНА) (ВСЁ уже отфильтровано в п.2) Смысл понятен? Это то???? Все сложности только в том, что форум плохо представляет задачу.  | 
|||
| 
    29
    
        GANR    
     22.02.13 
            ✎
    23:03 
 | 
         
        Принцип в (28) прост - найти то, что НЕ соответствует условию, а затем выбрать то, что не попадает в множество не соответствующих записей.     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |