Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хранимая процедура


Страницы:   1 2 3

Knight ©   (2008-06-17 09:01:00) 

Помогите осознать логику процедуры, которая должена сделать выборку из двух таблиц.

В результирующий набор данных должны попасть строки из табл1 для которых табл1.поле1=табл2.поле1 AND табл2.поле2=0 ... или табл1.поле1 попадает в интервал значений табл2.поле1 такой, что хотя бы один из них имеет табл2.поле2=0

табл1
---------------------
   поле1     поле2
---------------------
1  |  1   | значение1
2  |  4   | значение2
3  |  6   | значение3
4  |  7   | значение4
5  |  14  | значение5

табл2
---------------------
   поле1     поле2
---------------------
1  |  2   | 23
2  |  5   | 0
3  |  7   | 0
4  |  9   | 2322
5  |  11  | 111
6  |  13  | 232
7  |  15  | 0


ЮЮ   (2008-06-17 12:22:00) [21]

> Всё ли так и можно ли это как-то ускорить?

А индексы в таблицах есть?
Как долго работает запрос типа
 Select
   ObjID, MAX(ttime) MaxTime,  MIN(ttime) MinTime  
 FROM T2
 WHERE ttime BETWEEN @TimeStart AND @TimeEnd
 GROUP BY ObjID
за день, за неделю?


Knight   (2008-06-17 12:20:00) [22]

> [30] ЮЮ ©   (17.06.08 12:05)

Поле1 datetime


ЮЮ   (2008-06-17 12:05:00) [23]

а если объект попадет в интервал несколько раз, коль ты ещё и интервал задействуещь? Или поле1 уникально в обеих таблицах?


Knight   (2008-06-17 11:54:00) [24]

> [27] ЮЮ ©   (17.06.08 11:47)

Есть табл1.поле1 и табл2.поле1 табл2.поле2

строка 1 значение - табл2.поле1
строка   значение - табл1.поле1
строка 2 значение - табл2.поле1

если табл2.поле2=0 в 1 или 2 то табл1.поле2 включается в таблицу результата.


Knight   (2008-06-17 11:49:00) [25]

> [27] ЮЮ ©   (17.06.08 11:47)

Почему не попала?

результат
---------------------
 поле1     поле2
---------------------
1  |  4   | значение2
2  |  6   | значение3
3  |  7   | значение4
4  |  14  | значение5


ЮЮ   (2008-06-17 11:47:00) [26]

> что хотя бы один из них имеет табл2.поле2=0


а если оба 0

 5  | 0
 6  | 666
 7  | 0

 5  | значение5
 6  | значение6
 7  | значение7

что для 6 выводить значение5 или значение7

Да и в примере у тебя есть

2  |  5   | 0
3  |  7   | 0

3  |  6   | значение3

Почему у тебя она (6-ка) не попала в результат?


Knight   (2008-06-17 11:47:00) [27]

Всё ли так и можно ли это как-то ускорить?


Knight   (2008-06-17 11:43:00) [28]

> [24] ЮЮ ©   (17.06.08 11:37)

Эта точка времени для проверки из процедуры

CREATE PROCEDURE GetBlaBla(
 @ObjID INT,
 @TimeStart datetime,
 @TimeEnd datetime
)
AS
BEGIN
 /* Procedure body */
                   
 SELECT ttime, v1 INTO #Temp FROM T1 WHERE ttime BETWEEN @TimeStart AND @TimeEnd AND IsZero(@ObjID,ttime)=1
 
 SELECT * FROM #Temp
 
 Drop table #Temp
END


ЮЮ   (2008-06-17 11:37:00) [29]

> CREATE FUNCTION IsZero (
> @ObjID INT,
> @dt datetime
> )


Это тоже в точкевремени, а не на интервале. Какая тогда разница, за день или за неделю?


Knight   (2008-06-17 11:36:00) [30]

> [22] ЮЮ ©   (17.06.08 11:32)

таб2   9   | 2322
-> таб1   7   | значение4
таб2   11  | 111
-> таб1   10  | значение5
таб2   13  | 232
-> таб1   12  | значение6
таб2   15  | 0


ЮЮ   (2008-06-17 11:32:00) [31]

> илитабл1.поле1 попадает в интервал значений табл2.поле1
> такой, что хотя бы один из них имеет табл2.поле2=0

т.е. если и есть запись для 15, не не 0
 15  | 222
выводим
 14  | значение5
?


Knight   (2008-06-17 11:30:00) [32]

В UDF оформил проверку нуля

CREATE FUNCTION IsZero (
 @ObjID INT,
 @dt datetime
)
RETURNS tinyint AS
BEGIN
 if exists(SELECT 1 FROM T2
   WHERE ttime BETWEEN (Select MAX(ttime) FROM T2 WHERE ttime<=@dt AND ObjID=@ObjID)
     AND (Select MIN(ttime) FROM T2 WHERE ttime>=@dt AND ObjID=@ObjID)
     AND v2=0 AND ObjID=@ObjID)

   RETURN 1
 RETURN 0
END


ЮЮ   (2008-06-17 11:14:00) [33]

>
> Зависит от заданного интревала времени… мож за день, мож
> за неделю, а мож за год :)

Что-то полей datetime не наблюдаю


> Раньше обходился простыми запросами… процедурами не пользовался,
> а оказывается удобная штука :)

Ешё есть UDF. Для сективных выборок ещё более удобны; можно использовать как таблицы в запросах :)

какая связь то? Доморщенная что ли? Типа 0(1)Բ(1) ? Или всеже eсть мастер-таблица, где есть все значения
 1-2,  4-7, 9-15 поля1 ?


Knight   (2008-06-17 11:02:00) [34]

О! (00:02:23)


Knight   (2008-06-17 11:02:00) [35]

Мдя.. 11 секунд за день... а за неделю пока не дождался :)))


Sergey13   (2008-06-17 09:55:00) [36]

> [16] Knight ©   (17.06.08 09:49)

Тогда возможно нужна не процедура, а функция, которая возвращает да/нет для КАЖДОЙ записи Т1.


Knight   (2008-06-17 09:49:00) [37]

> [15] Sergey13 ©   (17.06.08 09:47)

Зависит от заданного интревала времени... мож за день, мож за неделю, а мож за год :)


Sergey13   (2008-06-17 09:47:00) [38]

> [13] Knight ©   (17.06.08 09:42)

Я не очень знаю мелкомягкий синтаксис.
Для скольких записей из Т1 нужна выборка?


Knight   (2008-06-17 09:44:00) [39]

Если нулевое найдено, то запись вставляется в таблицу результата... из которой в конце делает выборка всех строк.


Knight   (2008-06-17 09:42:00) [40]

> [12] Sergey13 ©   (17.06.08 09:30)

т.е. для @TimeStart, @TimeEnd
1) Создаём временную таблицу результата
2) Делаем выборку из табл2 с мин>=@TimeStart и макс<=@TimeEND
3) Пробегаем по выборке из табл1 сверяя текущее @dt со поле2=0 для мин(поле1)>=@dt и макс(поле1)<=@dt

так?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо