Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 на своем месте стоит?


Наверх

Титульная страница Поиск, карта сайта Написать письмо