【发布时间】:2014-08-18 11:29:06
【问题描述】:
大家好!在过去的几天里,我一直在网上和 SO 上寻找解决方案。这是我的第一个问题,所以请耐心等待:)
在解释之前,如果它太简单了,我想道歉,但我已经尝试了我能想到的一切,但我一无所获。所以,让我们开始吧:)
问题是在 t3_access.auth_id 中有 user_id 和 group_id 之类的值,所以我需要编写一个查询来列出 t3_access.auth_id 列中列出的所有用户以及组后面的用户t3_access.auth_id。
在某些查询中甚至可以区分与 user_id 或 group_id 连接的用户吗?任何帮助都非常受欢迎。
这里是 sqlfiddle 链接:http://sqlfiddle.com/#!2/b6dd7/5
我有四个表及其结构:
t1_users (user_id, name, pwd_opts)
t2_connections (user_id, group_id, conn_opts)
t3_access (auth_id, class_name, gr_name)
t4_groups (group_id, group_name)
这里是示例数据:
create table t1_users ("user_id" varchar2(10), "name" varchar2(10), "pwd_opts" varchar2(10));
create table t2_connections ("user_id" varchar2(10), "group_id" varchar2(10), "conn_opts" varchar2(10));
create table t3_access ("auth_id" varchar2(10), "class_name" varchar2(10), "gr_name" varchar2(10), "access" varchar2(10));
create table t4_groups ("GROUP_ID" varchar2(10), "group_name" varchar2(20));
insert into t1_users ("user_id", "name", "pwd_opts", "usr_opts") values ('Peter','Peter Pan','OK','RESTRICTED');
insert into t1_users ("user_id", "name", "pwd_opts", "usr_opts") values ('George','George Michael','OK','NORMAL');
insert into t1_users ("user_id", "name", "pwd_opts", "usr_opts") values ('Danny','Danny Boy','LOCK','SPECIAL');
insert into t1_users ("user_id", "name", "pwd_opts", "usr_opts") values ('John','John Wayne','OK','NORMAL');
insert into t2_connections (user_id, group_id, conn_opts) values('Peter','GROUP1','NORMAL');
insert into t2_connections (user_id, group_id, conn_opts) values('Peter','GROUP2','NORMAL');
insert into t2_connections (user_id, group_id, conn_opts) values('George','GROUP2','SPECIAL');
insert into t2_connections (user_id, group_id, conn_opts) values('Danny','GROUP2','NORMAL');
insert into t2_connections (user_id, group_id, conn_opts) values('John','GROUP3','NORMAL');
insert into t3_access(auth_id, class_name, gr_name, access) values('Peter','class1','PROFILE1','READ');
insert into t3_access(auth_id, class_name, gr_name, access) values('GROUP2','class1','PROFILE2','READ');
insert into t3_access(auth_id, class_name, gr_name, access) values('GROUP3','class3','PROFILE3','UPDATE');
insert into t3_access(auth_id, class_name, gr_name, access) values('George','class2','PROFILE2','EXECUTE');
insert into t3_access(auth_id, class_name, gr_name, access) values('John','class4','PROFILE4','NONE');
insert into t4_groups (group_id, "group_name") VALUES ('GROUP1', 'first group');
insert into t4_groups (group_id, "group_name") VALUES ('GROUP2', 'second group');
insert into t4_groups (group_id, "group_name") VALUES ('GROUP3', 'third group');
我已经尝试过(我在两个选择之间尝试过 UNION、IN、EXISTS),但没有得到预期的结果:
select t2_connections.*, t3_access.*
from t2_connections
join t3_access ON t2_connections.group_id = t3_access.auth_id
where group_id IN (select auth_id from t3_access where auth_id like 'GROUP%');
select t2_connections.*, t3_access.*
from t3_access
join t2_connections ON t3_access.auth_id = t2_connections.user_id
where auth_id IN (select auth_id from t3_access where user_id like 'George' or auth_id like 'Danny' or auth_id like 'Peter' or auth_id like 'John' );
...我也试过了:
select t1_users.user_id, t1_users.name, t1_users.pwd_opts, t1_users.usr_opts,
t2_connections.group_id, t2_connections.conn_opts, t3_access.class_name, t3_access.gr_name,
t3_access.access
from t2_connections
join t1_users on t2_connections.user_id = t1_users.user_id
join t4_groups on t2_connections.group_id = t4_groups.group_id
join t3_access on t2_connections.group_id = t3_access.auth_id
where exists (select * from t3_access where t3_access.auth_id = t2_connections.user_id);
union
select t1_users.user_id, t1_users.name, t1_users.pwd_opts, t1_users.usr_opts,
t2_connections.group_id, t2_connections.conn_opts, t3_access.class_name, t3_access.gr_name,
t3_access.access
from t2_connections
join t1_users on t2_connections.user_id = t1_users.user_id
join t4_groups on t2_connections.group_id = t4_groups.group_id
join t3_access on t2_connections.group_id = t3_access.auth_id
where exists (select * from t3_access where t3_access.auth_id = t2_connections.group_id);
预期的输出应该是这样的:
user_id|name |pwd_|usr_opts |group_id|conn_opt|cl_name |gr_name |access
Peter | bla1 | ok | restricted | group1 | normal | class1 | profile1 | read
Peter | bla1 | ok | restricted | group2 | normal | class1 | profile2 | read
George| bla3 | ok | normal | group2 | special| class2 | profile2 | execute
George| bla3 | ok | normal | group2 | special| class1 | profile2 | read
Danny | bla4 |lock| special | group2 | normal | class1 | profile2 | read
John | bla5 | ok | normal | group2 | normal | class4 | profile4 | none
John | bla5 | ok | noraml | group3 | normal | class3 | profile3 | update
【问题讨论】:
-
如果您提出问题,我们可能会为您提供帮助。
-
第一次发帖,不习惯编辑器...不能很好的格式
-
您的示例不起作用。某些列不存在,某些列数据超出列宽,某些列名大小写不匹配。