![]() |
|
Запрос. Внутреннее соединенние не могу настроить связь | ☑ | ||
---|---|---|---|---|
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) прост - найти то, что НЕ соответствует условию, а затем выбрать то, что не попадает в множество не соответствующих записей.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |