Форум: "Базы";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизЗапрос с вычислением Найти похожие ветки
← →
DimDim © (2006-07-19 22:08) [0]Уважаемые Мастера, что-то я перегрелся! Помогите разобраться.
Есть две таблицы, по которым составлен запрос с вычисляемым полем.
Tab1
Kod Kol
1 100
2 150
3 200
Tab2
Kod Reliz
1 20
3 30
Запрос:SELECT
Tab1.Kod, Tab1.Kol, Tab2.Reliz,
(Tab1.Kol - Tab2.Reliz) AS Ostatok
FROM
Tab1LEFT OUTER JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)
дает результат:
Kod Kol Reliz Ostatok
1 100 20 80
2 150 Null Null
3 200 30 170
Как сделать, чтобы во 2-й строке место Null были реальные числа ( т.е. 0 и 150 )?
Заранее благодарен.
← →
sniknik © (2006-07-19 22:58) [1]> чтобы во 2-й строке место Null были реальные числа
надо их туда реально подставить если null...
p.s. реальность зависит от движка.
← →
Johnmen © (2006-07-19 23:28) [2]реальность зависит от СУБД.
← →
DimDim © (2006-07-19 23:30) [3]Базы DBISAM. Аналогично Paradox, dBASE.
← →
Johnmen © (2006-07-19 23:45) [4]а движок?
← →
DimDim © (2006-07-19 23:54) [5]Базы DBISAM используют собственный движок (компилируется в саму программу). Построение запросов полностью соответствует Local SQL.
← →
Johnmen © (2006-07-20 00:02) [6]Тогда универсальное решение - заменить в таблице все null на 0 для соотв.полей.
← →
DimDim © (2006-07-20 00:24) [7]Дык, я и спрашиваю как в это сделать в одном запросе?
В принципе, я уже решил проблему через временную таблицу. Т.е. сначала делается запрос с созданием набора данных, а потом запрос на его изменение по определенным условиям.
Через ж..., конечно, но работает.
← →
Johnmen © (2006-07-20 00:31) [8]>[6]
UPDATE Table SET Field=0 WHERE Field IS NULL
← →
ЮЮ © (2006-07-20 11:16) [9]1)
Выкинуть (Tab1.Kol - Tab2.Reliz) AS Ostatok из запроса, сделав вычислимым полем.
0 в Reliz можно получить также в доп.вычислимом поле.
если всеже хочется в запросе, то:SELECT
Tab1.Kod, Tab1.Kol, Tab2.Reliz, (Tab1.Kol - Tab2.Reliz) AS Ostatok
FROM
Tab1
JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)
/* выбираем лишь те строки, для которых существует пара в Tab2 */UNION
SELECT
Tab1.Kod, Tab1.Kol, 0, Tab1.Kol
FROM
Tab1
LEFT JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)
WHERE
Tab2.Kod IS NULL
/* выбираем лишь те строки, для которых нет пары в Tab2 */
0 возможно потребуется явно привести к типу поля Tab2.Reliz, если возниккнет ошибка приведенеи типов
← →
DimDim © (2006-07-26 11:51) [10]Еще один вариант:
SELECT Tab1.Kod, Tab1.Kol, Tab2.Reliz,
IF(Tab2.Reliz = Null
THEN Tab1.Kol ELSE (Tab1.Kol - Tab2.Reliz)) AS Ostatok
FROM
Tab1 LEFT OUTER JOIN Tab2 ON (Tab1.Kod = Tab2.Kod)
← →
ЮЮ © (2006-07-26 11:57) [11]IF(Tab2.Reliz = Null
THEN Tab1.Kol ELSE (Tab1.Kol - Tab2.Reliz)) AS Ostatok
Странный синтаксис. Это где такой используется?
В Local SQL IF THEN ELSE никаких нет
В других, известных мне, Tab2.Reliz = Null всегда даст FALSE
← →
sniknik © (2006-07-26 11:58) [12]> Еще один вариант: ...
> Базы DBISAM используют собственный движок (компилируется в саму программу). Построение запросов полностью
> соответствует Local SQL.
в локал sql нет контрукции IF(... THEN ... ELSE ...), значит или не полностью соотствует или не будет работать.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.047 c