我有一个带OBJECTS
的Oracle表columns Id, parent id, object_type and name
。
我的实时对象类型为Groups, Accounts and Services
。它们按照相同的顺序是分层的。这意味着,组包含帐户和帐户包含服务。因此,service.parent_id
会引用account.object_id
而account.parent_id
会引用同一个表格中的group.object_id
。
用于选择数据的条件字段必须作为参数传递给查询。现在,如果用户提供组ID,则查询必须获取属于该组中所有帐户的所有服务。 同样,如果用户为帐户提供ID,则查询必须返回帐户下的所有服务。
我已经编写了以下查询,但它并不能完全正常工作。有人可以帮我解决吗?
WITH services AS
(SELECT nco.object_id,
nco.parent_id,
nco.object_type_id,
nco.name
FROM objects nco
WHERE nco.object_type_id = 9146522450013755288 ),
accounts AS
(SELECT nco.object_id,
nco.parent_id,
nco.name
FROM objects nco,
services ss
WHERE nco.object_type_id=9145485031713653586
AND nco.object_id = ss.parent_id ),
groups AS
(SELECT nco.object_id,
nco.parent_id,
nco.name
FROM objects nco,
accounts sa
WHERE nco.object_id = sa.parent_id
AND nco.object_type_id = 9146513648413722258 )
SELECT *
FROM services ss,
accounts sa,
groups sg
WHERE ss.object_id IN (#Services#)
OR sa.object_id IN (#Accounts#)
OR sg.object_id IN (#Groups#)
使用(##)
将输入作为宏传递,并且可以传递多个组ID,帐户ID和服务ID。 object_type_id
是一个列,用于标识它是什么类型的对象。例如,9146513648413722258指服务,9145485031713653586指帐户等。
答案 0 :(得分:1)
在您的情况下,inner join
更有意义的是完全加入,
,因此
SELECT services.*
FROM objects groups
INNER JOIN objects accounts
ON groups.object_type_id=9146522450013755288
AND accounts.object_type_id=9146513648413722258
AND accounts.parent_id=groups.object_id
INNER JOIN objects services
ON services.object_type_id=9145485031713653586
AND services.parent_id=accounts.object_id
WHERE services.object_id IN (#Services#)
OR accounts.object_id IN (#Accounts#)
OR groups.object_id IN (#Groups#)
查询使用services
加入accounts
,groups
和objects
表(隐式地来自parent_id
表),然后过滤掉结果。