我总是在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)
关于Roles表 - type1,type2,如果role_name是此类型,则type3将具有Y.因此,如果role_name的“Regular”在type1中具有Y,则role-name的“Moderator”在type2中具有Y,而role_name的“Admin”将在type3中具有Y.我没有设计这个数据库。
所以我正在尝试做什么。我想输出以下内容:user_id,pageviews,role_name,city,state。
我正在从竞赛中选择user_id和综合浏览量。然后我需要获取此用户的role_name,所以我需要将Users表加入Contest表,对吧?
从那里,我还需要从Locations表中选择位置信息 - 我假设我只是加入了Locations.location_name = Users.location?
这是棘手的部分。我只想输出如果Roles表中的type1是Y.
我迷路了!
答案 0 :(得分: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"
很多括号:)
答案 1 :(得分: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,如果是位置名称,则必须将其连接到位置表中的该列。
编辑:接受的答案更好,我不认为访问需要括号。
答案 2 :(得分:0)
您能显示您当前使用的查询吗?你不能只加入role_name而忽略type1,type2,type3吗?我假设只有那3个role_names可用。
答案 3 :(得分: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还是实际名称引用。
答案 4 :(得分:-1)
我想我需要查看一些示例数据....我不理解用户和角色之间的关系,因为Users表中有一个字段role_name,它与Roles表有什么关系?
编辑注释现在使用SQL Explicit Join Best Practice
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'