Помогите написать SQL запрос
От: Аноним  
Дата: 13.03.05 04:35
Оценка:
Есть таблица 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.
Re: Помогите написать SQL запрос
От: Аноним  
Дата: 13.03.05 08:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>id — ключевое поле

А>id_parent — ссылка на id этой же таблицы

Не понятно, ссылка на id этой же таблицы — это как?
Почему так не работает:

select * from Departments where visibility = 1 and id_parent=null
Re: Помогите написать SQL запрос
От: Romkin  
Дата: 13.03.05 09:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть таблица 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.


Родители? Это требует рекурсии, а в SQL ее нет. Делай черех ХП, и посмотри на ibase.ru статьи по деревьям
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 >>
Re[2]: Помогите написать SQL запрос
От: Аноним  
Дата: 13.03.05 14:26
Оценка:
Здравствуйте, Drozdov, Вы писали:

Мне этот запрос надо запихунть во view... Если я использую для этого хранимую процедуру, как мне ее результат запихнуть во view?
Re[3]: Помогите написать SQL запрос
От: Drozdov  
Дата: 13.03.05 20:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, Drozdov, Вы писали:


А>Мне этот запрос надо запихунть во view... Если я использую для этого хранимую процедуру, как мне ее результат запихнуть во view?


Ну тогда придется слегка модифицировать процедуру (передавать ей ID и ID_PARENT) и написать такую Вьюшку

create view view1 (id,id_parent,name,visibility)
as
select d.id, d.id_parent, d.name,d.visibility  from departments d
where
d.visibility=1
and 
 exists (select p.id from new_procedure(d.id,d.id_parent) p)


Ну и на всякий случай процедура

CREATE PROCEDURE NEW_PROCEDURE (
    IN_ID INTEGER,
    IN_PARENT INTEGER)
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*/
 temp_id=:in_id;
 temp_id_parent=:in_parent;
 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...
Пока на собственное сообщение не было ответов, его можно удалить.