2010-11-11 4 views
0

J'ai toujours des difficultés avec les jointures dans Access. Quelqu'un peut-il me guider?Comment faire se joint aux conditions?

4 tables.

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

En ce qui concerne la table des rôles - type1, type2, type3 aura un Y si nom_rôle ce type. Donc, si "Regular" pour role_name aurait un Y dans type1, "Moderator" pour role-name aurait un Y dans type2, "Admin" pour role_name aurait un Y dans type3. Je n'ai pas conçu cette base de données.

Alors qu'est-ce que j'essaie de faire. Je souhaite générer les éléments suivants: id_utilisateur, pages vues, nom_rôle, ville, état.

Je sélectionne le user_id et les pages vues du concours. Je dois alors obtenir le nom de rôle de cet utilisateur, donc j'ai besoin de joindre la table des utilisateurs à la table du concours, non? À partir de là, je dois également sélectionner les informations d'emplacement dans le tableau Locations. Je suppose que je viens de rejoindre sur Locations.location_name = Users.location?

Voici la partie délicate. Je veux seulement sortir si type1, dans la table de rôles, est Y.

Je suis perdu!

Répondre

3

Pour autant que je peux voir, cela est une question qui peut être construit dans la fenêtre de création de la requête, parce que vous ne semblez pas avoir besoin de gauche rejoint ou toute autre modification, donc:

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" 

Beaucoup de parenthèses :)

+0

Pourquoi les parenthèses sont-elles requises? –

+0

O désolé, c'est l'accès :) –

+0

+1 pour recommander l'aide du concepteur de requête Access. Quiconque l'évite sans raison entrave leur capacité à faire les choses rapidement. –

-1

Je pense que j'ai besoin de voir des exemples de données ... Je ne comprends pas la relation entre les utilisateurs et les rôles car il y a un champ role_name dans la table Users, et comment cela relie-t-il la table Roles?

EDIT NOTE Maintenant, en utilisant SQL JOIN explicites les meilleures pratiques

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

nom_rôle de Les utilisateurs se lieraient avec role_name à partir des rôles. Cela ressemble beaucoup à la façon dont user_id dans Contest correspond à l'ID des utilisateurs. – Mik0r

+0

SÉLECTIONNER \t C.user_id \t, C.Vues \t, U.role_name \t, L.city \t, L.state \t à partir de concours C \t, l'utilisateur U \t, Emplacements L \t, rôles R OÙ \t \t C.user_id = U .id \t ET \t \t U.location = L.id \t ET \t \t U.role_name = R.role_name \t ET \t \t R.type1 = 'O' – Schenz

+0

N'utilisez jamais de syntaxe implicite. C'est une mauvaise pratique de programmation. – 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' 

Cela suppose que l'emplacement utilisateurs fait référence à l'ID de l'emplacement, si elle est le nom du lieu, alors il doit être joint à cette colonne dans la table des emplacements.

EDIT: La réponse acceptée est meilleure, je n'ai pas considéré que l'accès nécessite des parenthèses.

+0

Cela ne fonctionnera pas dans l'accès, il n'y a pas de parenthèses et Access est très difficile en effet à ce sujet. – Fionnuala

+0

Oui, merci de me l'indiquer –

+0

Je voudrais réitérer ce que @Remou a dit, que la meilleure façon de démarrer des requêtes comme celle-ci pour une utilisation dans Access est d'utiliser le générateur de requête Access. Il prend soin de tout cela pour vous. Je n'ai jamais écrit une jointure à utiliser dans Access, et j'ai programmé dans Access depuis 1996. J'ai souvent édité une jointure créée par le QBE, mais je ne la code jamais à la main. –

0

Pouvez-vous montrer quelle requête vous utilisez actuellement? Vous ne pouvez pas vous joindre à role_name et simplement ignorer le type1, type2, type3? Je suppose qu'il y a juste ces 3 role_names disponibles.

0

Je sais que vous ne l'avez pas conçu, mais pouvez-vous changer la structure? Parfois, il est préférable de passer à une fondation solide plutôt que de vivre dans la maison qui est sur le point de tomber sur votre tête. En fonction de si l'emplacement dans votre table utilisateur est un ID ou la référence du nom réel.