Как сделать соединение с условиями? - PullRequest
0 голосов
/ 11 ноября 2010

Я всегда борюсь с объединениями в 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)

Относительно таблицы ролей - тип1, тип2, тип3 будет иметь Y, если для этого типа будет указано имя_ роли. Таким образом, если «Regular» для role_name будет иметь Y в type1, «Moderator» для role-name будет иметь Y в type2, «Admin» для role_name будет иметь Y в type3. Я не проектировал эту базу данных.

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

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

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

Вот сложная часть. Я хочу вывести, только если type1 в таблице Roles - Y.

Я потерян!

Ответы [ 5 ]

3 голосов
/ 11 ноября 2010

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

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"

Lotsскобок:)

1 голос
/ 11 ноября 2010
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'

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

РЕДАКТИРОВАТЬ: ответ принят лучше, я не считаю, что доступ требует скобок.

0 голосов
/ 11 ноября 2010

Я знаю, что вы не спроектировали это, но можете ли вы изменить структуру? Иногда лучше перейти к прочному основанию, чем жить в доме, который вот-вот упадет вам на голову.

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)

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

0 голосов
/ 11 ноября 2010

Можете ли вы показать, какой запрос вы используете в настоящее время?Разве вы не можете просто присоединиться к ролью_имя и просто игнорировать type1, type2, type3?Я предполагаю, что есть только те 3 роли ролей.

0 голосов
/ 11 ноября 2010

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

РЕДАКТИРОВАТЬ ПРИМЕЧАНИЕ Теперь, используя 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...