2010-11-11 65 views
0

我一直在与Access内的连接斗争。有人可以指导我吗?如何与条件连接?

4张桌子。

Contest (id, user_id, pageviews) 
Users (id, role_name, location) 
Roles (id, role_name, type1, type2, type3) 
Locations (id, location_name, city, state) 

关于角色表 - type1,type2,如果role_name是此类型,type3将具有Y.因此,如果role_name的“Regular”在类型1中具有Y,则角色名称的“Moderator”在类型2中具有Y,而角色名称的“Admin”在类型3中具有Y.我没有设计这个数据库。

所以我想要做什么。我想输出以下内容:user_id,pageviews,role_name,city,state。

我从竞赛中选择user_id和综合浏览量。然后我需要获取该用户的role_name,所以我需要将Users表加入到Contest表中,对吧?

从那里,我还需要从位置表中选择位置信息 - 我假设我只是加入Locations.location_name = Users.location?

这是棘手的部分。我只想输出如果在角色表内的type1是Y.

我迷路了!

回答

3

据我所看到的,这是可以建在查询设计窗口查询,因为你似乎并不需要左连接或其它任何修改,所以:

SELECT Contest.user_id, 
     Contest.pageviews, 
     Roles.role_name, 
     Locations.city, 
     Locations.state 
FROM ((Contest 
INNER JOIN Users 
ON Contest.user_id = Users.id) 
INNER JOIN Roles 
ON Users.role_name = Roles.role_name) 
INNER JOIN Locations 
ON Users.location = Locations.location_name 
WHERE Roles.type1="Y" 

很多圆括号:)

+0

为什么需要括号? – 2010-11-12 14:03:34

+0

对不起,这是访问:) – 2010-11-12 14:05:20

+0

+1推荐使用Access查询设计器。任何避免无缘无故的人都会阻碍他们迅速完成任务的能力。 – 2010-11-12 18:44:22

-1

我想我需要看一些示例数据....我不明白用户和角色之间的关系,因为Users表中有一个字段role_name,并且它如何与角色表相关联?

编辑注:现在,使用SQL明确加入最佳实践

SELECT 
    C.user_id 
    , C.pageviews 
    , U.role_name 
    , L.city 
    , L.state 
FROM 
    Contest C 
    INNER JOIN Users U  ON C.user_id = U.id 
    INNER JOIN Locations L ON U.location = L.id 
    INNER JOIN Roles R  ON U.role_name = R.role_name 
WHERE 
    R.type1='Y' 
+0

role_name from用户将与角色中的role_name关联起来。所以这很像是Contest中的user_id如何与来自用户的ID匹配。 – Mik0r 2010-11-11 18:28:05

+0

选择 \t C.user_id \t,C.浏览量 \t,U.role_name \t,L.city \t,L.state FROM \t竞赛Ç \t,用户ü \t,地点大号 \t,角色 - [R WHERE \t \t C.user_id = U .ID \t AND \t \t U.location = L.id \t AND \t \t U.role_name = R.role_name \t AND \t \t R.type1 ='Y' – Schenz 2010-11-11 18:32:55

+0

切勿使用隐式语法。这是一个糟糕的编程习惯。 – HLGEM 2010-11-11 19:23:46

1
select * 
from users u 
    inner join contest c on u.id = c.user_id and 
    inner join locations l on l.id = u.location and 
    inner join roles r on r.role_name = u.role_name 
where r.type1 = 'Y' 

这是假设的用户该位置是指位置ID,如果是位置名称,然后它必须被连接到该列在地点表中。

编辑:接受的答案是更好的,我不认为访问需要括号。

+0

这在Access中不起作用,没有括号,Access对此非常挑剔。 – Fionnuala 2010-11-11 19:40:11

+0

是的,感谢您指出这一点 – 2010-11-12 14:05:47

+0

我想重申@Remou说过,开始在Access中使用这种查询的最佳方式是使用Access查询构建器。它为您处理所有这些。我从来没有亲手写过一个用于Access的连接,自1996年以来我一直在使用Access进行编程。我经常编辑由QBE创建的连接,但我从来没有用手编写连接。 – 2010-11-12 18:42:57

0

你可以显示你目前使用的查询吗?你不能只加入role_name,只是忽略type1,type2,type3?我假设只有那3个role_names可用。

0

我知道你没有设计它,但你能改变结构吗?有时候,最好转移到一个坚固的基础上,而不是住在即将落在你头上的房子里。

SELECT u.user_id, c.pageviews, 
IIF(r.role_Name = "Moderator", r.type1 = Y, 
IIF(r.role_name="Admin", r.type2="Y", r.type3="Y")), 
l.location_name FROM users as u 
INNER JOIN roles as r On (u.role_name = r.role_name) 
INNER JOIN contest as c On (c.user_id = u.Id) 
INNER JOIN locations as l On (u.location = l.location_name or l.id) 

取决于用户表中的位置是一个id还是实际的名称引用。