Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Неправильно джойню? (число прочтений - 5652 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Неправильно джойню?
06. Сентября 2007 :: 11:50
Печать  
Имеется запрос со след. текстом:
Код
Выбрать все
Запрос.Текст = "
	|SELECT
	//тут ничего интересного
	|FROM $ДокументСтроки.ПриходнойОрдерСтрах as ПКО
	|	INNER JOIN $Документ.ПриходнойОрдерСтрах as ПКОШапка ON ПКОШапка.IDDOC = ПКО.IDDOC
	|	INNER JOIN 1SJourn as ЖурПКО ON ЖурПКО.IDDOC = ПКО.IDDOC
	|	INNER JOIN $Справочник.ДоговораСтрахования1 AS ДоговораСтрахования1 ON $ПКО.ДоговорСтрахования = ДоговораСтрахования1.ID
	|	LEFT JOIN $Справочник.ДоговораСтрахования1 AS ПервичДог ON ПервичДог.ID = $ДоговораСтрахования1.ПервичДог
	|	LEFT JOIN $Документ.ЗаявлениеУбыточностиСтрах as Убытки ON $ПКО.ДоговорСтрахования = $Убытки.Договор
	|	INNER JOIN 1SJourn as ЖурУбытки ON ЖурУбытки.IDDOC = Убытки.IDDOC
	|WHERE
	|	 ЖурПКО.Date BETWEEN :НачДата~~ AND :КонДата~~
	|	AND ЖурПКО.Closed = 5
	|	AND $ПКОШапка.КоррСчет = :КоррСчет~
	|	AND ЖурУбытки.ISMARK = '' 



Хочу иметь примерно такую таблицу:

Страхователь      ДатаОплаты      СумОплаты      ДатаУб СуммаУб
иванов                  06.03.2007      188.5            
иванов                  06.03.2007      131                  13.03.2007      50
иванов                   20.03.2007      57.5                  13.03.2007      4.6

Но в итоге получаю:

Страхователь      ДатаОплаты      СумОплаты      ДатаУб СуммаУб
иванов                  06.03.2007      131                  13.03.2007      50
иванов                   20.03.2007      57.5                  13.03.2007      4.6

т.е. не исчез договор, по которому нет убытка.
Но ведь я присоединяю таблицу документов убытков ЛЕВЫМ соединением, а уже к ниму ПОЛНЫМ журнал этих убытков.

Если я убираю строку:
Код
Выбрать все
INNER JOIN 1SJourn as ЖурУбытки ON ЖурУбытки.IDDOC = Убытки.IDDOC 


то всё пашет нормально, но мне это соединение необходимо.
Где я не прав???

П.С. База - ДБФ
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #1 - 06. Сентября 2007 :: 12:05
Печать  
А если так:

AND (ЖурУбытки.ISMARK = ' ' OR ЖурУбытки.ISMARK IS NULL)

ну или как там для DBF это условие пишется? Озадачен

P.S. INNER - это не полное, а внутреннее.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #2 - 06. Сентября 2007 :: 12:10
Печать  
Даже если вообще убрать условие
Код
Выбрать все
AND ЖурУбытки.ISMARK = ''  


ничего не меняется.   Нерешительный
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #3 - 06. Сентября 2007 :: 12:20
Печать  
LEFT JOIN 1SJourn as ЖурУбытки
+Ответ #1
  

1&&2&&3
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #4 - 06. Сентября 2007 :: 12:26
Печать  
Спасибо, запахало!  Класс Всю голову себе уже разбил....  Плачущий
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #5 - 07. Сентября 2007 :: 13:34
Печать  
Нет, видать не до конца понял....
К этому запросу добавляю условие:
Цитата:
AND ((ЖурУбытки.Date BETWEEN :НачДата~~ AND :КонДата~~) OR (ЖурУбытки.Date IS NULL))

т.е. получается такой запрос:
Код
Выбрать все
|SELECT
	//тут ничего интересного
	|FROM $ДокументСтроки.ПриходнойОрдерСтрах as ПКО
	|	INNER JOIN $Документ.ПриходнойОрдерСтрах as ПКОШапка ON ПКОШапка.IDDOC = ПКО.IDDOC
	|	INNER JOIN 1SJourn as ЖурПКО ON ЖурПКО.IDDOC = ПКО.IDDOC
	|	INNER JOIN $Справочник.ДоговораСтрахования1 AS ДоговораСтрахования1 ON $ПКО.ДоговорСтрахования = ДоговораСтрахования1.ID
	|	LEFT JOIN $Справочник.ДоговораСтрахования1 AS ПервичДог ON ПервичДог.ID = $ДоговораСтрахования1.ПервичДог
	|	LEFT JOIN $Документ.ЗаявлениеУбыточностиСтрах as Убытки ON $ПКО.ДоговорСтрахования = $Убытки.Договор
	|	LEFT JOIN 1SJourn as ЖурУбытки ON ЖурУбытки.IDDOC = Убытки.IDDOC
	|WHERE
	|	 ЖурПКО.Date BETWEEN :НачДата~~ AND :КонДата~~
	|	AND ЖурПКО.Closed = 5
	|	AND $ПКОШапка.КоррСчет = :КоррСчет~
	|	AND (ЖурУбытки.ISMARK = ' ' OR ЖурУбытки.ISMARK IS NULL)
	|"+?(флаг=1," AND ((ЖурУбытки.Date BETWEEN :НачДата~~ AND :КонДата~~) OR (ЖурУбытки.Date IS NULL))","")+"
|";
 


Результаты запросов получаются совершенно разные при флаг=1 и при флаг=0 (при флаг=1 строк в результирующей ТЗ намного меньше).
Объясните, пжлст, что я делаю не так?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #6 - 07. Сентября 2007 :: 13:52
Печать  
т.е. он оставляет строки, где чётко выполняется последнее условие и выкидывает строки где убытки были не ввыбранном периоде. Как сделать так, чтобы он не выкидывал эти строки, а просто в соответствующих столвцах оставлял ПУСТО? Ведь ЛЕВОЕ соединение с эти журналом, чёрт его подери....  Плачущий
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #7 - 07. Сентября 2007 :: 13:54
Печать  
JohnyDeath писал(а) 07. Сентября 2007 :: 13:34:
Результаты запросов получаются совершенно разные при флаг=1 и при флаг=0 (при флаг=1 строк в результирующей ТЗ намного меньше).
Объясните, пжлст, что я делаю не так?

очевидно при флаг=1 выборка ограничивается интервалом дат. разве не так?
  

1&&2&&3
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #8 - 07. Сентября 2007 :: 13:58
Печать  
ну так стоит
Цитата:
LEFT JOIN 1SJourn as ЖурУбытки ON ЖурУбытки.IDDOC = Убытки.IDDOC

или как? Я понимаю, если б это было INNER... или я что-то не понимаю?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #9 - 07. Сентября 2007 :: 14:03
Печать  
А если перенести это условие в секцию FROM?
Хотя фиг. С левым соединением ЖурУбытки отфильтруется, а Убытки - нет. Завернуть ЖурУбытки в подзапрос?..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #10 - 07. Сентября 2007 :: 14:15
Печать  
JohnyDeath писал(а) 07. Сентября 2007 :: 13:58:
ну так стоит
Цитата:
LEFT JOIN 1SJourn as ЖурУбытки ON ЖурУбытки.IDDOC = Убытки.IDDOC

или как? Я понимаю, если б это было INNER... или я что-то не понимаю?

при флаг = 0, получишь все ПКО
при флаг = 1, получишь только те ПКО у которых нет убытков или убытки из интервала
  

1&&2&&3
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #11 - 07. Сентября 2007 :: 14:15
Печать  
Есть, конечно, вариант в секции SELECT в нужных мне колонках проставить что-то типа:
Цитата:
IIF((ЖурУбытки.Date BETWEEN :НачДата~~ AND :КонДата~~), Убытки.Сумма, 0) as СуммаУбытка

Но, ИМХО, это как-то некрасиво, не эргономично и не практично....
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #12 - 07. Сентября 2007 :: 14:17
Печать  
trad писал(а) 07. Сентября 2007 :: 14:15:
JohnyDeath писал(а) 07. Сентября 2007 :: 13:58:
ну так стоит
Цитата:
LEFT JOIN 1SJourn as ЖурУбытки ON ЖурУбытки.IDDOC = Убытки.IDDOC

или как? Я понимаю, если б это было INNER... или я что-то не понимаю?

при флаг = 0, получишь все ПКО
при флаг = 1, получишь только те ПКО у которых нет убытков или убытки из интервала

А как получить все ПКО, но с убытками только из этого интервала?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #13 - 07. Сентября 2007 :: 14:19
Печать  
если тебе нужно
при флаг = 0, получать все ПКО
при флаг = 1, получать все ПКО и убытки к ним только из интервала
, то пиши

|LEFT JOIN 1SJourn as ЖурУбытки ON ЖурУбытки.IDDOC = Убытки.IDDOC"+?(флаг=1," AND ЖурУбытки.Date BETWEEN :НачДата~~ AND :КонДата~~","")+"
  

1&&2&&3
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Неправильно джойню?
Ответ #14 - 07. Сентября 2007 :: 14:28
Печать  
О, точно! Очередной огромный респект!
Теперь можно идти на выходные с чистой совестью!  Очень довольный
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать