【问题标题】:Select records that don't have relation in other tables选择在其他表中没有关系的记录
【发布时间】:2018-03-18 03:02:51
【问题描述】:

我有以下表格:

其中每个表的主键是其名称 + id(例如:UserRole.UserRoleIdUserRole 的主键,UserRole.RoleIdUserRole 中的 Role 的外键)。

所以我想选择所有 Funcionality 而不选择 Profil (Funcionality.ProfileFuncionality.Count = 0),我使用以下查询:

SELECT * FROM Funcionality WHERE FuncionalityId NOT IN (SELECT FuncionalityId FROM ProfileFuncionality);

但我不知道如何进行以下选择:

所有Funcionality 没有Role

Funcionality.ProfileFuncionality.Count > 0 
AND Funcionality.ProfileFuncionality.Profile.RoleProfile.Count = 0

所有Funcionality 不带User

Funcionality.ProfileFuncionality.Count > 0 
AND Funcionality.ProfileFuncionality.Profile. RoleProfile.Count > 0
AND Funcionality.ProfileFuncionality.Profile.RoleProfile.Role.UserRole.Count = 0

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    只需扩展您的子选择:

    所以对于没有角色的所有功能:

    SELECT *
    FROM Funcionality
    WHERE FuncionalityId NOT IN
       (SELECT FuncionalityId
        FROM ProfileFuncionality
        JOIN Profile 
            ON Profile.Profileid = ProfileFuncionality.Profileid
        JOIN RoleProfile 
            ON Profile.Profileid = RoleProfile.Profileid);
    

    对于无用户的所有功能:

    SELECT *
    FROM Funcionality
    WHERE FuncionalityId NOT IN
        (SELECT FuncionalityId
         FROM ProfileFuncionality
         JOIN Profile 
            ON Profile.Profileid = ProfileFuncionality.Profileid
         JOIN RoleProfile 
            ON Profile.Profileid = RoleProfile.Profileid
         JOIN Role 
            ON Role.Roleid = RoleProfile.Roleid
         JOIN UserRole 
            ON Role.Roleid = UserRole.Roleid)
     MINUS
     SELECT *
     FROM Funcionality WHERE FuncionalityId NOT IN
         (SELECT FuncionalityId
          FROM ProfileFuncionality
          JOIN Profile 
             ON Profile.Profileid = ProfileFuncionality.Profileid
          JOIN RoleProfile 
             ON Profile.Profileid = RoleProfile.Profileid);
    

    我使用减号来减去没有角色出现的功能,因为它们显然也没有用户

    【讨论】:

    • 谢谢,它成功了,只是第一次查询你忘了添加这个:AND FONCTIONNALITEID IN (SELECT distinct FONCTIONNALITEID FROM PROFILFONCTIONNALITE);,我已经更新了你的答案
    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 2015-06-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多