Re: Помогите написать SQL запрос
От: Drozdov  
Дата: 13.03.05 10:43
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть таблица Departments с полями

А>id — ключевое поле
А>name — название
А>id_parent — ссылка на id этой же таблицы
А>visibility — видимость департамента.
А>Нужно получить все департаменты, у которых visibility = 1, причем в выборку не должны попадать и те записи, у ротелей которых (на любом уровне) visibility <> 1.

А>пример:

А>id name id_parent visibility
А>1 A null 0
А>2 B 1 1
А>3 C 2 1
А>4 D null 1

А>Запрос должен вернуть

А>id name id_parent visibility
А>4 D null 1
А>не смортя на то, что у B и С visibility = 1;

А>Использую IB.


Server: Yaffil
Среда разработки: IBExpert

Я бы сделал так:

CREATE PROCEDURE NEW_PROCEDURE 
RETURNS (
    ID INTEGER,
    NAME VARCHAR(10),
    PARENT INTEGER,
    VISIBILITY INTEGER)
AS
DECLARE VARIABLE TEMP_ID INTEGER;
DECLARE VARIABLE ISTRUE INTEGER;
DECLARE VARIABLE FL INTEGER;
DECLARE VARIABLE NEW1_ID SMALLINT;
DECLARE VARIABLE NEW1_ID_PARENT INTEGER;
DECLARE VARIABLE TEMP_ID_PARENT INTEGER;
DECLARE VARIABLE PAR SMALLINT;
begin
 For select id, id_parent
     from departments where visibility =1
 into :temp_id,:temp_id_parent
  DO
 Begin
   isTrue=1;
   if (:temp_id_parent is not null) then
      begin
        fl=1;
        isTrue=0;
        par=:temp_id_parent;
    While (fl=1)   do
     begin
         new1_id=null;
         new1_id_parent=null;
         select d5.id, d5.id_parent from departments d5 where d5.visibility =1 and d5.id=:par into :new1_id,:new1_id_parent;
         par=:new1_id_parent;
         if ((:new1_id is not null) and (:new1_id_parent is null))  then
          begin
            fl=0;
            isTrue=1;
           end
         if ((:new1_id is  null) and (:new1_id_parent is null))  then
           begin
             fl=0;
             isTrue=0;
            end
       end
  End
  /*Если все классно */
  if (isTrue=1) then
  Begin
    select d1.id, d1.id_parent,d1.name,d1.visibility from departments d1 where d1.id=:temp_id
    into :id, :parent, :name, :visibility;
   suspend;
  end
 End
end
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.