Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Invalid Column Reference   Найти похожие ветки 

 
Stupid   (2004-04-27 12:00) [0]

Пишет : 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;


 
Курдль ©   (2004-04-27 12:03) [1]

А у Вас INTO на своем месте стоит?


 
Stupid   (2004-04-27 12:06) [2]

А где должен быть?

такой запрос проходит без проблем :
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:07) [3]


> 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


 
Соловьев ©   (2004-04-27 12:12) [4]


>     SELECT ID_SKON, ID_PR
>      FROM SUB_KON
>      WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
>      INTO :TEK_SKON, :TEK_DAUDZ;

что этим запросом хочешь получить?


 
Stupid   (2004-04-27 12:14) [5]

Соловьев, зачем мне FOR?

Мне нужно определить кол-во записей попадающих под условие, и если такая запись только одна - удалить её и сделать некоторве изменения в других записях.


 
Stupid   (2004-04-27 12:17) [6]

>     SELECT ID_SKON, ID_PR
>      FROM SUB_KON
>      WHERE ID_PR = :TEK_PR AND IETILP_ID = 0
>      INTO :TEK_SKON, :TEK_DAUDZ;

этим запросом ничего не хочу, просто для эксперимента ввёл. компилятор его пропустил, значит структура запроса правильна.
выходит что count с чем-то не дружит.


 
Курдль ©   (2004-04-27 12:18) [7]


> Мне нужно определить кол-во записей попадающих под условие,
> и если такая запись только одна - удалить её и сделать некоторве
> изменения в других записях.

А зачем тогда count? if exists не подходит? :)


 
Соловьев ©   (2004-04-27 12:19) [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:22) [9]


> А зачем тогда count? if exists не подходит? :)

Фигню сморозил-с :)


 
Stupid   (2004-04-27 12:22) [10]

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


 
Курдль ©   (2004-04-27 12:25) [11]

А загнать в курсор и посчитать (это я так - фантазирую, с ИБ почти не работал).


 
Stupid   (2004-04-27 12:29) [12]

пока сделал так:

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. надеюсь можно как-то это дело объединить.


 
HSolo ©   (2004-04-27 14:23) [13]

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


 
Соловьев ©   (2004-04-27 14:33) [14]


> HSolo ©   (27.04.04 14:23) [13]

где гарантия что будет возвращено только 1 строка?


 
HSolo ©   (2004-04-27 14:34) [15]

> где гарантия что будет возвращено только 1 строка?
Никакой. Поэтому - for select... Это просто пример запроса, возвращающего те ID, количество которых ровно 1. Чтобы не делать 2 запроса :)



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

Текущий архив: 2004.05.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
7-1081866904
Beton-karton
2004-04-13 18:35
2004.05.23
Работа с Windows Mobile


8-1078354024
Uber ASSA
2004-03-04 01:47
2004.05.23
Перерисовка Flash ролика


14-1083516596
Maxim Vetera
2004-05-02 20:49
2004.05.23
Заглядывая в будущее!


1-1084124365
TNewb
2004-05-09 21:39
2004.05.23
Опять StringGrid


7-1080714655
c13prog
2004-03-31 10:30
2004.05.23
Как определить название диска в CD-ROM?