[英]SQL Server Multiple join return duplicated values
我的数据库 TEST 下有 4 个表:
当我使用内连接和交叉连接而不是返回 520 行连接上面的表时,它返回 2600 行,大多数值重复
我需要一个没有重复的最终输出
询问:
select user.*
from TEST.USER user
inner join TEST.USER_GROUP_PERMISSION user_grp1
on user.APPLICATION_ID = user_grp1.APPLICATION_ID
inner join TEST.PERMISSION_TYPE permission2_
on user_grp1.PERMISSION_TYPE_ID = permission2_.PERMISSION_TYPE_ID
inner join TEST.GROUPS groups
on user_grp1.GROUP_ID = groups.GROUP_ID
cross join TEST.PERMISSION_TYPE permission4_
where user_grp1.PERMISSION_TYPE_ID = permission4_.PERMISSION_TYPE_ID
and groups.GROUP_ID in (101)
and permission4_.PERMISSION_TYPE in (0 , 1 , 2 , 3 , 4 , 5 , 6)
and user.NAME = 'ROBIN'
and user.ACTIVE = '1'
order by upper(user.DISPLAY_VERSION) asc
如果要显示没有重复的用户,请仅从用户中选择。 不要加入! 查询应如下所示:
select * from users where ...
您的查询很难理解,尤其是权限类型加入了两次,甚至一次内部联接伪装成交叉联接。 看起来您希望用户 ROBIN 前提是他处于活动状态并且他的应用程序具有组 101 的组权限并键入 1 到 6。这将是:
select *
from test.user
where name = 'ROBIN'
and active = '1'
and application_id in
(
select application_id
from test.user_group_permission
where group_id = 101
and permission_type_id in
(
select permission_type_id
from test.permission_type
where permission_type in (0, 1, 2, 3, 4, 5, 6)
)
)
order by upper(display_version);
(你也可以将permission_type
加入user_group_permission
,如果你比IN
更喜欢它。)
我会使用exists
来表达查询:
select user.*
from TEST.USER user
where user.NAME = 'ROBIN'
user.ACTIVE = '1' and
exists (select 1
from TEST.USER_GROUP_PERMISSION user_grp1 join
TEST.PERMISSION_TYPE permission2_
on user_grp1.PERMISSION_TYPE_ID = permission2_.PERMISSION_TYPE_ID join
TEST.GROUPS groups
on user_grp1.GROUP_ID = groups.GROUP_ID join
TEST.PERMISSION_TYPE permission4_
on user_grp1.PERMISSION_TYPE_ID = permission4_.PERMISSION_TYPE_ID
where user.APPLICATION_ID = user_grp1.APPLICATION_ID
groups.GROUP_ID in (101) and
permission4_.PERMISSION_TYPE in (0 , 1 , 2 , 3 , 4 , 5 , 6)
)
order by upper(user.DISPLAY_VERSION) asc
然后,最重要的索引是users(name, active, upper(DISPLAY_VERSION))
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.