![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Invalid Column Reference [D3, IB6.x]
Stupid © (2004-04-27 12:00:00)Пишет : Invalid Column Reference. Или нельзя одновременно получить Count и значение поля?
CREATE PROCEDURE CLEAR_ONCE_KONSTR
AS
DECLARE VARIABLE TEK_PR INTEGER;
DECLARE VARIABLE TEK_SKON INTEGER;
DECLARE VARIABLE TEK_DAUDZ INTEGER;
BEGIN
FOR SELECT ID_PR
FROM PROJEKT
INTO :TEK_PR
DO BEGIN
SELECT ID_SKON, COUNT(DISTINCT ID_SKON)
FROM SUB_KON
WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
INTO :TEK_SKON, :TEK_DAUDZ;
IF (:TEK_DAUDZ = 1) THEN
BEGIN
UPDATE SUB_KON SET IETILP_ID = 0 WHERE IETILP_ID = :TEK_SKON;
DELETE FROM SUB_KON WHERE ID_SKON = :TEK_SKON;
END
END
END;
HSolo (2004-04-27 14:34:00) [1]> где гарантия что будет возвращено только 1 строка?
Никакой. Поэтому - for select... Это просто пример запроса, возвращающего те ID, количество которых ровно 1. Чтобы не делать 2 запроса :)
Соловьев (2004-04-27 14:33:00) [2]
> HSolo © (27.04.04 14:23) [13]
где гарантия что будет возвращено только 1 строка?
HSolo (2004-04-27 14:23:00) [3]SELECT ID_SKON, COUNT(ID_SKON)
FROM SUB_KON
WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
GROUP BY ID_SKON
HAVING COUNT(ID_SKON) = 1
Stupid (2004-04-27 12:29:00) [4]пока сделал так:
CREATE PROCEDURE CLEAR_ONCE_KONSTR
AS
DECLARE VARIABLE TEK_PR INTEGER;
DECLARE VARIABLE TEK_SKON INTEGER;
DECLARE VARIABLE TEK_DAUDZ INTEGER;
BEGIN
FOR SELECT ID_PR
FROM PROJEKT
INTO :TEK_PR
DO BEGIN
SELECT COUNT(DISTINCT ID_SKON)
FROM SUB_KON
WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
INTO :TEK_DAUDZ;
IF (:TEK_DAUDZ = 1) THEN
BEGIN
SELECT ID_SKON
FROM SUB_KON
WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
INTO :TEK_SKON;
UPDATE SUB_KON SET IETILP_ID = 0 WHERE IETILP_ID = :TEK_SKON;
DELETE FROM SUB_KON WHERE ID_SKON = :TEK_SKON;
END
END
END;
но не хотелось бы делать 2 запроса, один на проверку кол-ва записей, а другой на получение нужного ID. надеюсь можно как-то это дело объединить.
Курдль (2004-04-27 12:25:00) [5]А загнать в курсор и посчитать (это я так - фантазирую, с ИБ почти не работал).
Курдль (2004-04-27 12:22:00) [6]
> А зачем тогда count? if exists не подходит? :)
Фигню сморозил-с :)
Stupid (2004-04-27 12:22:00) [7]если будет возвращено несколько строк, мне с ними ничего делать не надо. мне нужно сделать что-то только тогда, когда возвращается только одна запись.
Соловьев (2004-04-27 12:19:00) [8]
> зачем мне FOR?
Потому как может быть возвращено несколько строк
> Мне нужно определить кол-во записей попадающих под условие
> SELECT ID_SKON, COUNT(DISTINCT ID_SKON)
> FROM SUB_KON
> WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
> INTO :TEK_SKON, :TEK_DAUDZ;
бред сивой кобылы - без обид.
Можешь написать конкретно что за условия и структура таблиц?
Курдль (2004-04-27 12:18:00) [9]
> Мне нужно определить кол-во записей попадающих под условие,
> и если такая запись только одна - удалить её и сделать некоторве
> изменения в других записях.
А зачем тогда count? if exists не подходит? :)
Stupid (2004-04-27 12:17:00) [10]> SELECT ID_SKON, ID_PR
> FROM SUB_KON
> WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
> INTO :TEK_SKON, :TEK_DAUDZ;
этим запросом ничего не хочу, просто для эксперимента ввёл. компилятор его пропустил, значит структура запроса правильна.
выходит что count с чем-то не дружит.
Stupid (2004-04-27 12:14:00) [11]Соловьев, зачем мне FOR?
Мне нужно определить кол-во записей попадающих под условие, и если такая запись только одна - удалить её и сделать некоторве изменения в других записях.
Соловьев (2004-04-27 12:12:00) [12]
> SELECT ID_SKON, ID_PR
> FROM SUB_KON
> WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
> INTO :TEK_SKON, :TEK_DAUDZ;
что этим запросом хочешь получить?
Соловьев (2004-04-27 12:07:00) [13]
> SELECT ID_SKON, COUNT(DISTINCT ID_SKON)
> FROM SUB_KON
> WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
+FOR
+GROUP BY ID_SKON
+DO
-DISTINCT
Stupid (2004-04-27 12:06:00) [14]А где должен быть?
такой запрос проходит без проблем :
CREATE PROCEDURE CLEAR_ONCE_KONSTR
AS
DECLARE VARIABLE TEK_PR INTEGER;
DECLARE VARIABLE TEK_SKON INTEGER;
DECLARE VARIABLE TEK_DAUDZ INTEGER;
BEGIN
FOR SELECT ID_PR
FROM PROJEKT
INTO :TEK_PR
DO BEGIN
SELECT ID_SKON, ID_PR
FROM SUB_KON
WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
INTO :TEK_SKON, :TEK_DAUDZ;
IF (:TEK_DAUDZ = 1) THEN
BEGIN
UPDATE SUB_KON SET IETILP_ID = 0 WHERE IETILP_ID = :TEK_SKON;
DELETE FROM SUB_KON WHERE ID_SKON = :TEK_SKON;
END
END
END;
Курдль (2004-04-27 12:03:00) [15]А у Вас INTO на своем месте стоит?