Страница 2 из 2

Добавлено: 29 окт 2007, 16:28
Александр
понимаешь в том то и дело что запрос

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

SELECT 
   Coalesce((SELECT vv.value FROM lsdbo.attrib_value_view av, lsdbo.value_string_view vv 
                 WHERE av.value_id = vv.id AND av.object_id = rw.id AND av.attrib_id = 3000000000002),'')
 FROM lsdbo.object_reference_view rw,lsdbo.object_type_view    
WHERE (rw.type_id = lsdbo.object_type_view.id) and (rw.id =4000000015666)
в QA выдает ошибку
Server: Msg 8624, Level 16, State 21, Line 1
Internal SQL Server error.

Добавлено: 29 окт 2007, 16:32
Александр
to Disillusioned
а что за функция GetStrValue откуда она, я уже весь дымлюсь :wink: :wink:

Добавлено: 29 окт 2007, 16:36
Disillusioned
Да сам напиши ее и назови как хочешь. Внутри функции выборка значения + если значение IS NULL то присвоение значения по умолчанию.

Добавлено: 29 окт 2007, 16:40
Александр
на хп чтоль-да ну ее нафиг... из за такой мелочи..., тут хочу разобраться- в стандартной функции ms sql? Кстати а ведь есть же такая функция у самой Лоции - осталось поискать ее, ну хотя это тоже не совсем то

Добавлено: 29 окт 2007, 16:51
Disillusioned
Тогда может лучше на SQL.RU?
Если выборка значений атрибута мелочь, то что тогда в Лоции не мелочь? Ту же самую функцию можно и в ХП использовать, да и работать с функциями удобнее хотя бы из-за компактности записи (особенно в редакторе действий).
Хотя, конечно, дело вкуса...
Что касается поиска функции Лоции, уверен, он займет больше времени, чем написание собственной...

Добавлено: 29 окт 2007, 17:02
Юрий
перепишы запрос в следующем виде и все будет Ок!

SELECT Coalesce(vv.value,'')+' '+Coalesce(vv1.value,'')
FROM lsdbo.object_reference_view rw
left join lsdbo.object_type_view ot on rw.type_id = ot.id
-- первый атрибут
left join lsdbo.attrib_value_view av on rw.id = av.object_id and av.attrib_id = 3000000000002
left join lsdbo.value_string_view vv on av.value_id = vv.id and av.attrib_id = 3000000000002
-- сдедующий атрибут
left join lsdbo.attrib_value_view av1 on rw.id = av1.object_id and av1.attrib_id = 3000000000001
left join lsdbo.value_string_view vv1 on av1.value_id = vv1.id and av1.attrib_id = 3000000000001
where rw.id=100001101830067

Добавлено: 30 окт 2007, 08:54
Александр
Да все Ок :wink: :wink:
а скажи - если знаешь... в чем могло быть дело - почему эта функция не работает с простым синтаксисом Лоции - а только с объединениями в стиле microsoft?? точнее не так... почему работает с переменными а с прямыми запросами нет - нигде в документации ничего похожего не нашел (мы используем в этом филиале MSSQL2000 SP4)

Добавлено: 30 окт 2007, 09:14
Юрий
Почему в стиле Microsoft??? Кто тебе такую ерунду сказал.
Объясню почему я использую join - при таком синтаксисе SQL активно использует индексы и выбирает оптимально данные.
А в этом стиле я писал не только на MSSQL я пришел к такому написанию после программирования отчетов и интерфейсов для системы "Галактика". Причем стояла она не на MSSQL.
И была такая-же проблема с быстродействием пришлось попотеть.
И кстати мне помог их трактат(разработчиков "Галактики") по оптимизации работы с базой.

Да у Лоции очень незатейливый синтаксис, отсюда и скорость. :)

Добавлено: 30 окт 2007, 09:21
Юрий
Да совсем забыл - при таком написании у тебя не будет в MSSQL ограничения на 10 атрибутов.

Добавлено: 30 окт 2007, 09:25
Александр
Все мои познания в SQL ограничиваются книжкой для хакеров по Transact-SQL :wink: , к сожалению мыслить множествами до сих пор не получается также как и при переходе на ООП в свое время, - нужно чтобы в голове все перевернулось в очередной раз :wink:

Добавлено: 30 окт 2007, 09:38
Юрий
У меня примерно 1.5 года пошло на то что-бы все это в голове осело и я разобрался более менее как делать быстрые запросы.
Причем занимался все это время только запросами.
И то постоянно узнаю чтонибудь новенькое! :D