Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Объединения Union (число прочтений - 4161 )
abjurer
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 9
Зарегистрирован: 09. Февраля 2009
Re: Объединения Union
Ответ #15 - 09. Февраля 2009 :: 10:07
Печать  
Если исходить из того, что все IDDOC из таблицы $Документ.Хустановка являются подмножеством множества значений IDDOC таблицы _1SJOURN, то левое внешнее соединение (LEFT OUTER) будет равнозначно внутреннему (INNER). Если допущение неверно, то значит нарушена целостность базы данных (или как это еще называется, но ситуация в этом случае нештатная).
Или ты имеешь в виду некие внутренние реализации MSSQL, которые быстрее отрабатывают именно внутреннее соединение?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Объединения Union
Ответ #16 - 09. Февраля 2009 :: 10:17
Печать  
Твой запрос
Код
Выбрать все
SELECT ДокХол.IDDOC [Ссылка $Документ.Хустановка]
	, $ДокХол.Холодильник [Холодильник $Справочник.Холодильники]
	, $ДокХол.Контрагент [Контрагент $Справочник.Контрагенты]
	, CAST(Left(Журнал.DATE_TIME_IDDOC, 8) AS DateTime) ДатаДок
FROM $Документ.Хустановка AS ДокХол
	LEFT OUTER JOIN _1SJOURN AS Журнал ON ДокХол.IDDOC = Журнал.IDDOC
WHERE ((Журнал.CLOSED & 1) = 1)
	AND Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата
 


Означает ко всем документам Установка надо добавить еще все
проведенные документы по оперативному учету за заданный период.


Также inner join быстрее и с меньшей нагрузкой выполняется
чем left join  т.к.
inner join требует точного совпадения аттрибутов ( как правило аттрибуты это индексы)
когда идет left join надо отобрать сначала все что совпало и добавить все записи из второй таблицы с null полями а это и время
и немалые ресурсы sql сервера.
  
Наверх
 
IP записан
 
abjurer
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 9
Зарегистрирован: 09. Февраля 2009
Re: Объединения Union
Ответ #17 - 09. Февраля 2009 :: 10:23
Печать  
Спасибо за подробности. Приму к сведению. Попытаюсь переделать эстетики ради Улыбка
Но в принципе запрос и с левым соединением отрабатывает за 1-2 секунды. Сервер со скулом как был напряжен на 50-60%, так и остался (43 пользователя сейчас работают)
  
Наверх
 
IP записан
 
Злой Бобр
Junior Member
**
Отсутствует



Сообщений: 56
Местоположение: Украина, Кривой Рог
Зарегистрирован: 07. Марта 2009
Пол: Мужской
Re: Объединения Union
Ответ #18 - 07. Марта 2009 :: 14:24
Печать  
Так невзлетит. Нужно явно добавить справочник и тогда через $ПустойИД. Насчет правильности подхода с LEFT JOIN - учить небуду, сам со временем разберешся что к чему, и почему.
Примерно так:
[code]
(SELECT ДокХол.IDDOC [Ссылка $Документ.Хустановка]
, $ДокХол.Холодильник [Холодильник $Справочник.Холодильники]
Контр.ID [Контрагент $Справочник.Контрагенты]
, CAST(Left(Журнал.DATE_TIME_IDDOC, 8) AS DateTime) ДатаДок
FROM $Документ.Хустановка AS ДокХол
INNER JOIN $Справочник.Контрагенты AS Контр ON $ДокХол.Контрагент=Контр.ID
LEFT OUTER JOIN _1SJOURN AS Журнал ON ДокХол.IDDOC = Журнал.IDDOC
WHERE ((Журнал.CLOSED & 1) = 1)
AND (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата)
UNION ALL
SELECT Хснятие.IDDOC
, $ДокХол.Холодильник
Контр.ID
, CAST(Left(Журнал.DATE_TIME_IDDOC, 8) AS DateTime)
FROM $Документ.Хснятие AS Хснятие
LEFT OUTER JOIN _1SJOURN AS Журнал ON Хснятие.IDDOC = Журнал.IDDOC
LEFT OUTER JOIN $Документ.Хустановка AS ДокХол ON $Хснятие.ДокументУ = ДокХол.IDDOC
INNER JOIN $Справочник.Контрагенты AS Контр ON $ДокХол.Контрагент=Контр.ID
WHERE (Журнал.ISMARK = 0)
AND (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата))
UNION ALL
SELECT ДокХол.IDDOC
, $ДокХол.Холодильник
, $ПустойИД
, CAST(Left(Журнал.DATE_TIME_IDDOC, 8) AS DateTime)
FROM $Документ.Хремонт AS ДокХол
LEFT OUTER JOIN _1SJOURN AS Журнал ON ДокХол.IDDOC = Журнал.IDDOC
WHERE ((Журнал.CLOSED & 1) = 1)
AND (Журнал.DATE_TIME_IDDOC BETWEEN :НачДата AND :КонДата)
AND ($ДокХол.ВидОперации = :ВыбОперация)
[/code]

Нарисовал на одном дыхании, так что проверь. Должно по идее работать нормально. Удачи
  

Если у вас есть деньги тогда мы идем к вам!!!
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать