Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / isnull ... / 7 сообщений из 7, страница 1 из 1
29.07.2004, 22:43
    #32628223
Aleksey Kh.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnull ...
Будет-ли выполнятся select внутри isnull в случаях:

1. если используется конструкция:
Код: plaintext
1.
set p=isnull(p1,(select ...))
если по факту оказывается, что p1 is not null

2. если используется конструкция:
Код: plaintext
1.
2.
3.
select isnull(t1.p1,(select ...))
from t1
where ...
если по факту для строки оказывается, что p1 is not null (но есть строки с p1=null)

???
...
Рейтинг: 0 / 0
29.07.2004, 23:33
    #32628251
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnull ...
Ну это достаточно просто проверить... Делаем функцию:
Код: plaintext
1.
2.
3.
4.
create function test(in c char( 1 )) returns char( 1 )
begin
	message c type status to client;
	return 'a'
end;

И зовем ее:
Код: plaintext
1.
2.
3.
4.
5.
6.
begin 
	declare t1 char( 1 );
	declare t2 char( 1 );
	set t1=null;
	set t2='b';
	select isnull(t1, test('1')) as "t1", isnull(t2, test('2')) as "t2";
end;

И получам вполне приличную картинку.
...
Рейтинг: 0 / 0
30.07.2004, 00:40
    #32628266
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnull ...
В булевых операциях ASA приоритетность всегда будут иметь сначала запросы, потом функции, далее обычные булевые условия.

Так что для пункта 1 SELECT будет выполнен по любому.

Для пункта 2 все будет зависеть от подзапроса. Если он не обращается к полям главного запроса, то он будет один раз выполнен и уже полученный результат использован в запросе. Если же он ссылается на главный запрос, то будет организован subquery, который будет вызван для каждой записи главного запроса, что с точки зрения производительности не есть гуд. Для таких случаев рекомендуется перенести подзапрос в FROM и соединить тем же LEFT JOIN. Ну и почаще смотреть план запросов в ISQL - в идеале в планах subquery быть не должно, для этого в первую очередь не стоит как раз увлекаться совать подзапросы в выражения :)
...
Рейтинг: 0 / 0
30.07.2004, 00:42
    #32628267
Aleksey Kh.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnull ...
Блин, на любой из моих сегодняшних вопросов можно ответить самому.
Я знаю. Но я вторую ночь на работе и мне не до экспериментов :(.
...
Рейтинг: 0 / 0
30.07.2004, 00:56
    #32628272
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnull ...
Сочувствую. Желаю побыстрее вернуться в реальную жизнь.
...
Рейтинг: 0 / 0
30.07.2004, 00:56
    #32628273
Aleksey Kh.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnull ...
ASCRUSЕсли он не обращается к полям главного запроса
т.е. в предикате на него не ссылаются?

ASCRUSДля таких случаев рекомендуется перенести подзапрос в FROM и соединить тем же LEFT JOIN.
Э-э-э, не понял.
я, вообще-то имел ввиду следующую ситуацию:
Код: plaintext
1.
2.
3.
4.
select 
 t1.col1,
 isnull(t1.col2,(select t2.col2 from t2 where t2.col1=t1.col1))
from t1
как ее надо преобразовать?


ASCRUSНу и почаще смотреть план запросов в ISQL ...
"пусть будет проклят тот день, когда я сел за баранку этого пылесоса..." © :))
...
Рейтинг: 0 / 0
30.07.2004, 01:24
    #32628284
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
isnull ...
авторт.е. в предикате на него не ссылаются?
То есть подзапрос внутри себя не использует ссылки на алиасы и поля главного запроса.

авторкак ее надо преобразовать?
Код: plaintext
1.
2.
select t1.col1, isnull(t1.col2, t2.col2)
from t1
  left join t2 on t2.col1=t1.col1
если в таблице t2 гарантировано есть записи на все записи таблицы t1, то тогда будет лучше вместо left join написать inner join.

P.S. А вообще то по этом запросу могу сто пудово сказать, что явно налицо нарушения нормализации форм и непродуманная структура БД, так как при правильной проектировке соединений таблиц таким способом в запросах просто не должно быть.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / isnull ... / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]