Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

как побороть преобразование в конструкторе вида

270
28 апреля 2009 года
Drew
265 / / 20.07.2000
запрос выглядит так:
select top(100) percent a1,a2
from base as b
where a1 in (select rrr from base2) and (a2='1' or a3='2')

это всё работает на УРА и шустро

когда перетаскивается сей запрос в конструктор вида, конструктор преобразует его в вид

select top(100) percent a1,a2
from base as b
where (a1 in (select rrr from base2) and a2='1') or (a1 in (select rrr from base2) and a3='2')

... ну вроде того...

и работает это МЕДЛЕННО, потому что выборка делается в этом случае ДВАЖДЫ (?)
как победить это преобразование? и что это вообще такое?
5
28 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Drew
и что это вообще такое?


Похоже на глюк конструктора.

Цитата: Drew
как победить это преобразование?


Переписать с JOINом:

 
Код:
SELECT b1.a1, b1.a2
FROM base1 AS b1 LEFT JOIN base2 AS b2 ON b1.a1 = b2.rrr
WHERE b1.a2 = '1'
    OR b1.a2 = '3'
270
28 апреля 2009 года
Drew
265 / / 20.07.2000
создаю через New Query запрос

SELECT TOP (1000) CreditVid, SsudaAccountN, SsudaDateBeg, SsudaDateEnd, ProsrDateDolg, ProsrDateProc, ClientFIO
FROM dbo.kf
WHERE (CreditVid IN (select [type] from ssuda_types where ssuda ='1'))
AND SsudaDateEnd<GETDATE()
and (DATEDIFF(day,ProsrDateDolg,GETDATE())<30 or DATEDIFF(day,ProsrDateProc,GETDATE())<30)

всё путем - быстро работает и даёт то, что надо
затем решил создать вид. вставил всё вышеуказанное в конструктор видов и получил ВОТ ТАКОЕ

SELECT TOP (1000) creditvid, ssudaaccountn, ssudadatebeg, SsudaDateEnd, ProsrDateDolg, ProsrDateProc, clientfio
FROM dbo.kf
WHERE (creditvid IN
(SELECT type
FROM dbo.ssuda_types
WHERE (ssuda = '1'))) AND (SsudaDateEnd < GETDATE()) AND (DATEDIFF(day, ProsrDateDolg, GETDATE()) < 30 OR
DATEDIFF(day, ProsrDateProc, GETDATE()) < 30) OR
(creditvid IN
(SELECT type
FROM dbo.ssuda_types AS ssuda_types_2
WHERE (ssuda = '1'))) AND (SsudaDateEnd < GETDATE()) AND (ProsrDateDolg IS NULL) OR
(creditvid IN
(SELECT type
FROM dbo.ssuda_types AS ssuda_types_1
WHERE (ssuda = '1'))) AND (SsudaDateEnd < GETDATE()) AND (ProsrDateProc IS NULL)

это последнее работает ... ОЧЕНЬ медленно и я не совсем уверен, что это ТО ЖЕ САМОЕ...

ВОПРОС: как сделать, чтобы конструктор видов не изобретал своё?
5
28 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Drew
ВОПРОС: как сделать, чтобы конструктор видов не изобретал своё?

Сделать с нуля все тоже что и там. Конструктор не любит вложенных запросов. Он заточен на JOIN-ы.

270
28 апреля 2009 года
Drew
265 / / 20.07.2000
разумеется я тоже так думал, что с нуля всё пройдёт... надуть конструктор не удалось. можешь попробовать сам, сделав аналог.
а JOIN.... мне не нужен здесь JOIN...
мне нужен именно фильтр
5
28 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Что мешает выполнить скрипт вида:
 
Код:
CREATE VIEW [dbo].[vw_MyViewName]
AS
SELECT TOP (1000) CreditVid, SsudaAccountN, SsudaDateBeg, SsudaDateEnd, ProsrDateDolg, ProsrDateProc, ClientFIO
FROM dbo.kf
WHERE (CreditVid IN (select [type] from ssuda_types where ssuda ='1'))
AND SsudaDateEnd<GETDATE()
and (DATEDIFF(day,ProsrDateDolg,GETDATE())<30 or DATEDIFF(day,ProsrDateProc,GETDATE())<30)
270
29 апреля 2009 года
Drew
265 / / 20.07.2000
хм.... а ведь это мысль!
завтра попробую - должно сработать!

да! кстати! Вот В ТАКОМ виде преобразования не происходит:

SELECT TOP (1000) CreditVid, SsudaAccountN, SsudaDateBeg, SsudaDateEnd, ProsrDateDolg, ProsrDateProc, ClientFIO
FROM dbo.kf
WHERE (CreditVid IN (select [type] from ssuda_types where ssuda ='1'))
AND SsudaDateEnd<GETDATE()
and (DATEDIFF(day,ProsrDateDolg,GETDATE())<30 or DATEDIFF(day,ProsrDateProc,GETDATE())<30)

преобразовывать он его начинает тогда, когда добавляешь

SELECT TOP (1000) CreditVid, SsudaAccountN, SsudaDateBeg, SsudaDateEnd, ProsrDateDolg, ProsrDateProc, ClientFIO
FROM dbo.kf
WHERE (CreditVid IN (select [type] from ssuda_types where ssuda ='1'))
AND SsudaDateEnd<GETDATE()
and (DATEDIFF(day,ProsrDateDolg,GETDATE())<30 or DATEDIFF(day,ProsrDateProc,GETDATE())<30 or ProsrDateDolg is not null)
270
29 апреля 2009 года
Drew
265 / / 20.07.2000
спасибо за совет! у меня видно заколодило!

да! не в курсе, как сделать, чтобы исполнение вида (по команде "открыть") не завершалось по таймауту?

в свойствах сервера, В Connections у меня стоИт "0" (там где было 600).
Query отрабатывает без таймаута, а вид открывается с ругательством.
5
29 апреля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Drew
спасибо за совет! у меня видно заколодило!

да! не в курсе, как сделать, чтобы исполнение вида (по команде "открыть") не завершалось по таймауту?

в свойствах сервера, В Connections у меня стоИт "0" (там где было 600).
Query отрабатывает без таймаута, а вид открывается с ругательством.


Не знаю. Я Sql Server Management Studio 2008 пользуюсь (экспрессом), вроде таких проблем с вьюхами не встречал, да у меня и базы-то не слишком большие.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог