2010-11-11 2 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, type3 будет иметь Y, если имя_роли этот тип. Поэтому, если для параметра «Обычный» для role_name будет существовать Y внутри type1, «Модератор» для имени роли будет иметь Y внутри type2, «Администратор» для имени роли будет иметь Y внутри type3. Я не создал эту базу данных.

Так что я пытаюсь сделать. Я хочу вывести следующие: user_id, pageviews, role_name, city, state.

Я выбираю user_id и просмотры страниц из Конкурса. Затем мне нужно получить имя роли этого пользователя, поэтому мне нужно присоединиться к таблице Users в таблице Contest, правильно?

Оттуда мне нужно также выбрать информацию о местоположении из таблицы Locations - предположим, я просто присоединяюсь к Locations.location_name = Users.location?

Вот сложная часть. Я хочу только вывести, если тип1 в таблице ролей равен 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

Зачем нужны скобки? –

+0

О, извините, это доступ :) –

+0

+1 для рекомендации с использованием конструктора запросов Access. Любой, кто избегает этого без уважительной причины, мешает их быстрому выполнению. –

-1

Я думаю, мне нужно увидеть некоторые данные образца. Я не понимаю отношения между пользователями и ролями, потому что в таблице Users есть поле role_name и как это соотносится с таблицей ролей?

EDIT Примечание Теперь с помощью SQL Явного 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' 
+0

имя_пользователя от пользователя связывается с именем role из ролей. Так что это очень похоже на то, как user_id в Contest совпадает с id от пользователей. – Mik0r

+0

SELECT \t C.user_id \t, C.Просматриваемые \t, U.role_name \t, L.city \t, L.state ОТ \t Contest С \t, пользователей ¯u \t, Местоположение L \t, Роли R ГДЕ \t \t C.user_id = U .id \t И \t \t U.location = L.id \t И \t \t U.role_name = R.role_name \t И \t \t R.type1 = 'Y' – Schenz

+0

Никогда не используйте неявный синтаксис. Это плохая практика программирования. – HLGEM

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' 

Это предполагает, что местоположение пользователей относится к месту расположения идентификатора, если это название места, то он должен быть присоединен к этому столбцу в таблице местоположений.

EDIT: ответ принят лучше, я не считал, что для доступа нужны скобки.

+0

Это не будет работать в Access, нет круглых скобок, и Access действительно очень суетливый. – Fionnuala

+0

yep, спасибо, что указали, что вне –

+0

Я хотел бы повторить, что @Remou сказал, что лучший способ запускать запросы, подобные этому для использования в Access, - использовать построитель запросов Access. Он заботится обо всем этом для вас. Я никогда не писал рукописи для использования в Access, когда-либо, и программировал в Access с 1996 года. Я часто редактировал соединение, созданное QBE, но я никогда не кодировал его вручную. –

0

Можете ли вы показать, какой запрос вы используете в настоящее время? Не можете ли вы просто присоединиться к role_name и просто игнорировать type1, type2, type3? Я предполагаю, что есть только те 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) 

в зависимости от того, является ли местоположение в вашей таблице пользователя идентификатором или ссылкой на фактическое имя.

Смежные вопросы