Разное - украшаем запрос MS SQL

Аватара пользователя
pva

Разное - украшаем запрос MS SQL

Сообщение pva »

1. можно ли как-то запустить Query Analyzer (2000) с ярлычка, чтоб он не заново запускался, а создал окошко в уже открытом аналайзере? А то задолбал плодиться, я забываю смотреть, есть он в живых или нет.



2. есть уже заполненная табличка:



Код:

Код: Выделить всё

declare @dates1 table (
  recId     integer,  // прочая информация
  groupId  integer, // поле для группировки
  dateIn    datetime,  // начало отрезка времени
  dateOut   datetime); // конец отрезка времени

нужно оставить в ней записи, имеющие хотя бы одно пересечение с другими при одинаковой groupId. Остальные удалить. Я сделал, но мне кажтся чёто как-то некрасиво и медленно, через delete where not exists(...). Сами понимаете, некрасивые самолёты не летают. Есть варианты как причесать запрос?
Аватара пользователя
Busla

Re: Разное - украшаем запрос MS SQL

Сообщение Busla »

для MS SQL есть свой раздел форума

2. сразу сделать правильную (необходимую) выборку. Временные таблицы - очень ресурсоёмкое решение, так ли они нужны в данном случае?
Аватара пользователя
pva

Re: Разное - украшаем запрос MS SQL

Сообщение pva »

остаётся вопрос с временными view. Можно такие сделать? На сколько это критично к ресурсам? у меня услуги - это



Код:

Код: Выделить всё

accDebet join accCliPay on (accCliPay.accPayId=accDebet.accPayId and accCliPay.payCod=1)

Временные - это в том смысле, чтобы они уничтожались после выхода из блока, где были созданы, независимо от того успешно прошла операция или нет
Аватара пользователя
pva

Re: Разное - украшаем запрос MS SQL

Сообщение pva »

Не совсем то. 2 вызова одно функции приведёт к вычислению 2 раз одного и того же запроса, а мне хочется на этом съэкономить и не засорять базу
Аватара пользователя
Busla

Re: Разное - украшаем запрос MS SQL

Сообщение Busla »

Цитата:



для MS SQL есть свой раздел форума



Можно тему туда перенести? Я не заметил раздела



Может я неправильно понимаю как оно работает, обрисую задачу:

Есть табличка с оплаченными повременными услугами, примерно миллион-два записей (с 2004 года). Из них нужно выбрать такие записи за последние 4 недели, которые бы оплачивали одну и ту же услугу в одно и то же время, то есть выяснить какие есть перекрытия оплат.

Табличка имеет много всяких полей, я выбрал только нужные 4 поля за последние недели (около 1000 строчек), а потом искал пересечения



Код:

Код: Выделить всё

delete from
    @dates
from
    @dates debet1
where
    not exists (
        select * from @dates debet2
        where
	    debet1.recId  debet2.recId
	    and debet1.groupId = debet2.groupId
            and debet1.dateIn < debet2.dateOut
            and debet2.dateIn < debet1.dateOut);

А можно ли как-то создать временный view? чтобы съэкономить и упонятнить код
Аватара пользователя
amel27

Re: Разное - украшаем запрос MS SQL

Сообщение amel27 »

pva

1. Запускать скриптом, который проверяет наличие QA и либо запускает, либо активирует окно и отправляет комбинацию
Аватара пользователя
amel27

Re: Разное - украшаем запрос MS SQL

Сообщение amel27 »

pva, я бы всё-таки работал с изначальной таблицей

где-то примерно так:



Код:

Код: Выделить всё

select groupId, дата, count (*)
  from услуги
  where дата>'2008-08-15'
  group by groupId, дата
  having count (*)>1

на выходе получаем список перекрытий

(в примере не понял соотношение dateIn и dateOut)
Аватара пользователя
pva

Re: Разное - украшаем запрос MS SQL

Сообщение pva »

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

услуга 1: от '2008-01-01 12:00:00' до '2008-01-02 14:00:00'

услуга 2: от '2008-01-01 18:00:00' до '2008-01-02 12:00:00'
Аватара пользователя
pva

Re: Разное - украшаем запрос MS SQL

Сообщение pva »

т.е. имеем ряд временных диапазонов, нужно выбрать накладывающиеся? - да, группировкой тут не обойтись :-(

хотя всё равно не такой уж и монстрообразный запрос получается:



Код:

Код: Выделить всё

select u1.*
  from
    услуги u1, услуги u2
  where
    u1.dateIn>'2008-08-15' and u2.dateIn>'2008-08-15' -- 4 недели назад - лучше вынести в переменную
    and u1.groupId=u2.groupId2 and u1.recIdu2.recId
    and (u1.dateIn beetwen u2.dateIn and u2.dateOut or u1.dateOut beetwen u2.dateIn and u2.dateOut)
Аватара пользователя
pva

Re: Разное - украшаем запрос MS SQL

Сообщение pva »

Busla, Я приведу пример когда этот вариант не работает:



Код:

Код: Выделить всё

and (u1.dateIn beetwen u2.dateIn and u2.dateOut or u1.dateOut beetwen u2.dateIn and u2.dateOut)
     .....время................
  u1    1111111111111111111
  u2        2222222222222
ни начало ни конец u1 не входят в u2.

теперь из каких соображений я делал:



Код:

Код: Выделить всё

  u1        11111111111111
  u2          222222222222222
  1. если u2 начнётся после того, как u1 закончится - нет пересечения.
  2. если u1 начнётся после того, как u2 закончится - нет пересечения.
  3. иначе пересекаются.
упрощаем условие:
     not (u2.dateOut  u2.dateOut > u1.dateIn and u1.dateOut > u2.dateIn -->
--> u1.dateIn < u2.dateOut and u2.dateIn < u1.dateOut

Насчёт выборки действительно ступил - заработался. Всё действиетльно можно одним несложным селектом сделать. На сегодня такой вариант:



Код:

Код: Выделить всё

select
    u1.recId,
    u1.groupId,
    u1.dateIn,
    u1.dateOut
from
    услуги u1
    join услуги u2 on (
        getDate() - 4*7 
Ответить

Вернуться в «Программирование и базы данных»