Есть таблицы:
Код: Выделить всё
CREATE TABLE Module_News (
Module_New_ID BIGINT NOT NULL,
Project_FK BIGINT NOT NULL,
User_FK BIGINT NOT NULL,
Create_Date INTEGER NOT NULL,
Modified_Date INTEGER NOT NULL,
Title VARCHAR(250) NOT NULL,
"Message" VARCHAR(5000) NOT NULL,
Status SMALLINT DEFAULT 0 NOT NULL CONSTRAINT CC_Module_News_Status CHECK (Status in (0, 1, 2)),
Rating SMALLINT DEFAULT 0 NOT NULL,
Amount_Readings INTEGER DEFAULT 0 NOT NULL,
Language VARCHAR(2) NOT NULL,
IfActive SMALLINT NOT NULL CONSTRAINT CC_Module_News_IfActive CHECK (IfActive in (0, 1)),
CONSTRAINT PK_Module_News PRIMARY KEY (Module_New_ID)
);
CREATE TABLE Projects (
Project_ID BIGINT NOT NULL,
Parent_ID BIGINT,
Create_Date INTEGER NOT NULL,
Name VARCHAR(50) NOT NULL,
Description VARCHAR(500) NOT NULL,
Rating SMALLINT DEFAULT 0 NOT NULL,
Amount_Readings INTEGER DEFAULT 0 NOT NULL,
Language VARCHAR(2) NOT NULL,
IfActive SMALLINT DEFAULT 1 NOT NULL CONSTRAINT CC_Projects_IfActive CHECK (IfActive in (0, 1)),
CONSTRAINT PK_Projects PRIMARY KEY (Project_ID)
);
CREATE TABLE Project_Users (
Project_PF BIGINT NOT NULL,
User_PF BIGINT NOT NULL,
Params VARCHAR(500),
"Role" SMALLINT NOT NULL CONSTRAINT CC_Project_Users_Role CHECK ('Role' in (0, 10, 20, 100)),
IfActive SMALLINT DEFAULT 1 NOT NULL CONSTRAINT CC_Project_Users_IfActive CHECK (IfActive in (0, 1)),
Create_Date INTEGER NOT NULL,
Modified_Date INTEGER NOT NULL,
CONSTRAINT PK_Project_Users PRIMARY KEY (Project_PF, User_PF)
);
Код: Выделить всё
CREATE PROCEDURE Tree_Projects_Get_Nodes_ID(
AnID BIGINT,
Self SMALLINT)
RETURNS (
ID BIGINT)
AS
BEGIN
IF (:Self > 0) THEN
BEGIN
ID = :AnID;
SUSPEND;
END
FOR SELECT Project_ID FROM Projects
WHERE Parent_ID = :AnID INTO :ID
DO FOR SELECT ID FROM Tree_Projects_Get_Nodes_ID(:ID, 1) INTO :ID
DO SUSPEND;
SUSPEND;
END
Код: Выделить всё
SELECT
DISTINCT P.PROJECT_ID, P.PARENT_ID, P.NAME,
MN.PROJECT_FK, MN.USER_FK, MN.TITLE, MN.LANGUAGE,
PS.PROJECT_PF, PS.USER_PF, PS."ROLE"
FROM
PROJECTS P
JOIN
TREE_PROJECTS_GET_NODES_ID(8, 1) TP ON TP.ID = P.PROJECT_ID
JOIN
MODULE_NEWS MN ON MN.PROJECT_FK = P.PROJECT_ID
LEFT JOIN
PROJECT_USERS PS ON PS.PROJECT_PF IN (
SELECT ID FROM TREE_PROJECTS_GET_NODES_ID(8, 1)
) AND PS.USER_PF = MN.USER_FK
Код: Выделить всё
PS.PROJECT_PF IN (SELECT ID FROM TREE_PROJECTS_GET_NODES_ID(8, 1))