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