如何从具有相互关联数据的表中选择数据?

时间:2017-01-08 05:01:20

标签: sql oracle

我有一个带OBJECTS的Oracle表columns Id, parent id, object_type and name

我的实时对象类型为Groups, Accounts and Services。它们按照相同的顺序是分层的。这意味着,组包含帐户和帐户包含服务。因此,service.parent_id会引用account.object_idaccount.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指帐户等。

1 个答案:

答案 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加入accountsgroupsobjects表(隐式地来自parent_id表),然后过滤掉结果。