Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Вниз

Как составить SQL запрос?   Найти похожие ветки 

 
BlackKing   (2003-11-27 11:28) [0]

Такой вот запрос :

Update Material
Set Mat_Daudz =
(Select Sum(SSar_Daudz)
From Sp_Sar
Where Sp_Sar.Id_Mat = Material.Id_Mat) +
(Select Sum(SVSar_Daudz)
From SVp_Sar
Where SVp_Sar.Id_Mat = Material.Id_Mat)
Where Id_Mat = 10

Всё работает как надо, проблемы начинаются когда один из подзапросов не выдаёт никакого значения, Mat_Daudz остаётся пустым.
Как сделать, чтобы в Mat_Daudz попало значение суммы одного из подзапросов, который возвращает значение.


 
Sandman25   (2003-11-27 11:34) [1]

select case when field1 is null then 0 else field1 end +
case when field2 is null then 0 else field2 end
from table


 
BlackKing   (2003-11-27 12:02) [2]

Так что ли? похоже нет :o(

Update Material
Set Mat_Daudz =
(Select Case When Sum(SSar_Daudz) is null then 0 Else Sum(SSar_Daudz) end
From Sp_Sar
Where Sp_Sar.Id_Mat = Material.Id_Mat) +
(Select Case When Sum(SVSar_Daudz) is null then 0 Else Sum(SSar_Daudz) end
From SVp_Sar
Where SVp_Sar.Id_Mat = Material.Id_Mat)
Where Id_Mat = 10

Error
Token unknown - ..... When


 
Sandman25   (2003-11-27 12:15) [3]

Видимо, для сase в IB другой синтаксис. iif тут есть?


 
BlackKing   (2003-11-27 12:22) [4]

в Key Words есть и CASE и WHEN. IIF не замечен. Описания по Key Words у меня нет, есть только список. А в SQL я не очень то силён. Потому и прошу помощи.


 
BlackKing   (2003-11-27 12:25) [5]

Есть IF, но опять же, не знаю как им пользоваться в запросе. Мож он только для триггеров.


 
Alex_Bredin   (2003-11-27 12:32) [6]

если поля целые, можно приводить результаты подзапросов CAST-ом к INTEGER.


 
Кщд   (2003-11-27 12:32) [7]

согласно langref IB6 case нет


 
Alex_Bredin   (2003-11-27 12:33) [8]

если вещ-е то вроде нельзя.
а может и можно -пробовать надо. только не к INTEGER


 
BlackKing   (2003-11-27 12:36) [9]

Cast не помогает. Пробовал и к Integer и к Double Precision приводить.
Поля - Double Precision.


 
Sandman25   (2003-11-27 12:37) [10]

Если case нет, то в данном конкретном случае лучше сделать 2 select into variable, рассчитать нужное значение и затем устроить update.


 
Alex_Bredin   (2003-11-27 12:41) [11]


> Cast не помогает. Пробовал и к Integer и к Double Precision
> приводить.
> Поля - Double Precision.

не могет быть.CAST Null в ноль превращает железно(для целых).


 
BlackKing   (2003-11-27 12:41) [12]

хех...а в одном запросе ето можно сделать?
ето я написал 2 подзапроса, а их 7 :o)


 
Sandman25   (2003-11-27 12:45) [13]

[11] Alex_Bredin © (27.11.03 12:41)

Разве значение Ineteger не может быть NULL?

[12] BlackKing (27.11.03 12:41)

Подождите кого-нибудь из спецов по IB.
Пока что можно сделать только что-то типа
update table set field = (select sum);
update table set field = 0 where field is null;
update table set field = field + (select sum);
update table set field = 0 where field is null;
Но 4 update вместо 1, по-моему, многовато. Хотя работать будут быстро (если в каждом where id=? есть, конечно).


 
Zacho   (2003-11-27 12:46) [14]

В IB нет ни CASE, ни IIF. CASE есть в FB 1.5, а IIF - в Yaffil.
Так что или используй какую-нибудь UDF или вместо запроса напиши хранимую процедуру типа:

Select Sum(SSar_Daudz) From Sp_Sar Where Sp_Sar.Id_Mat =:ID INTO :SUM1;
IF (SUM1 IS NULL) THEN SUM1=0;
Select Sum(SVSar_Daudz) From SVp_Sar Where SVp_Sar.Id_Mat =:ID INTO :SUM2;
IF (SUM2 IS NULL) THEN SUM2=0;
Update Material
Set Mat_Daudz = SUM1+SUM2 Where Id_Mat =:ID;



> BlackKing (27.11.03 12:22) [4]
> в Key Words есть и CASE и WHEN. IIF не замечен. Описания
> по Key Words у меня нет, есть только список.

Иди на http://www.ibase.ru и качай Data Definition Guide и Language Reference, а так же читай статьи на http://www.ibase.ru/develop.htm


 
Zacho   (2003-11-27 12:53) [15]


> Alex_Bredin © (27.11.03 12:41) [11]
>
> не могет быть.CAST Null в ноль превращает железно(для целых).

Ничего подобного. CAST (NULL AS что-угодно) = NULL


 
BlackKing   (2003-11-28 16:56) [16]

А что вы скажете за такой вариант (разбить запрос на 3)?
Я не совсем извращенец? :o)

Update Material
Set Mat_Daudz = 0
Where Id_Mat = 10
---ExecSQL---

Update Material
Set Mat_Daudz = Mat_Daudz +
(Select Sum(SSar_Daudz)
From Sp_Sar
Where Sp_Sar.Id_Mat = Material.Id_Mat)
Where Id_Mat = 10
---ExecSQL---

Update Material
Set Mat_Daudz = Mat_Daudz +
(Select Sum(SVSar_Daudz)
From SVp_Sar
Where SVp_Sar.Id_Mat = Material.Id_Mat)
Where Id_Mat = 10
---ExecSQL---


 
Sandman25   (2003-11-28 16:59) [17]

Не будет работать. Это полностью эквивалентно Вашему первому запросу :)


 
BlackKing   (2003-11-28 17:03) [18]

А ведь работает.
В первом варианте было, если хоть один подзапрос выдавал Null, не считало всё. А в етом случае не Null значения сработают.


 
Sandman25   (2003-11-28 17:06) [19]

[18] BlackKing (28.11.03 17:03)

1) a = b + c
2) a = 0;
a = a + b;
a = a + c;

Если b или с равны Null, то и a будет Null.


 
Silver Alex   (2003-11-28 17:08) [20]


> BlackKing (27.11.03 11:28)

можно вставить проверку с помощью exists (если вы не знаете)

Update Material
Set Mat_Daudz =
(Select Sum(SSar_Daudz)
From Sp_Sar
Where Sp_Sar.Id_Mat = Material.Id_Mat) +
(Select Sum(SVSar_Daudz)
From SVp_Sar
Where SVp_Sar.Id_Mat = Material.Id_Mat)
Where Id_Mat = 10
and exists (Select Sum(SSar_Daudz)
From Sp_Sar
Where Sp_Sar.Id_Mat = Material.Id_Mat)
and exists (Select Sum(SVSar_Daudz)
From SVp_Sar
Where SVp_Sar.Id_Mat = Material.Id_Mat)

по смыслу просто посмотри потому что я особо не вникал в запрос.
Но смысл наверное понятен, есть записи изменяем, нет- игнорируем


 
Sandman25   (2003-11-28 17:10) [21]

[20] Silver Alex © (28.11.03 17:08)

К сожалению, exist будет лишний раз выполнять запрос. Лучше хранимую написать, как [14] Zacho © (27.11.03 12:46) советует.


 
Silver Alex   (2003-11-28 17:27) [22]


> Sandman25 © (28.11.03 17:10) [21]

наверное так и будет, это просто как вариант.Yо однажды проводили эксперимент.Тянули на клиент 200 000 записей, так первый запрос выполнялся ощутимое время , но последущие очень быстро (на MS SQL правда).Можно в принципе попробовать


 
Sandman25   (2003-11-28 17:32) [23]

[22] Silver Alex © (28.11.03 17:27)

Ну, я не исключаю, что некоторые "особо умные" СУБД увидят, что запросы одинаковые и заоптимизируют такой запрос, к тому же при втором расчете данные уже будут в кеше, но это не факт. Хранимая процедура в любом случае будет быстрее - и синтаксис проверен, и в псевдо-компилированный код переведен (в зависимости от СУБД).


 
BlackKing   (2003-11-28 17:33) [24]

попробовал...15 минут только с одним подзапросом :o)


 
ksan   (2003-11-28 20:15) [25]

Если разговор идет про IB, то по моему там все хранимые процедуры хранятся в BLR и не важно сколько раз ты их вызываешь, исполняется промежуточный код.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.007 c
3-75128
NewD
2003-12-01 06:46
2003.12.23
OleDb - хочу создать свою обертку


1-75163
md
2003-12-09 21:49
2003.12.23
инфа о файле


1-75204
Альф
2003-12-11 11:49
2003.12.23
Как програмно узнать количество строковых ресурсов ?


3-75079
dim-
2003-12-01 11:18
2003.12.23
Нужна помощь в Селекте


1-75160
unknown
2003-12-10 01:10
2003.12.23
VCL Components





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский