![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранимая процедура
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
так?