如何加入条件?

时间:2010-11-11 18:19:13

标签: sql ms-access

我总是在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.

我迷路了!

5 个答案:

答案 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'