Здравствуйте, <Аноним>, Вы писали:
А>Есть таблица 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 >>