2010-08-25 5 views
0

Je me demande s'il est possible d'y arriver dans MS Access 2007:conditionnelle REJOIGNEZ

Un client m'a donné plusieurs tables, et on m'a demandé pour certaines requêtes. L'un d'entre eux doit obtenir une valeur de champ à partir d'une table, en fonction de la valeur d'un champ de chaque enregistrement. Cela signifie, selon la région, qu'il faut regarder une table, une seconde ou une troisième.

Alors, je me demandais si je pouvais faire quelque chose comme ceci:

SELECT 
    table2.some_value 
FROM 
    table1 
INNER JOIN table2 
    ON CASE table1.SOME_VALUE THEN table3.id = table2.some_id ELSE 
     CASE table1.SOME_VALUE THEN table4.id = table2.some_id ELSE 
       table5.id = table2.some_id END END 

Est-il clair? Si ce n'est pas le cas, il suffit de demander et je répondrai à vos doutes.

EDIT:

Je pense que je ne suis pas assez clair. J'ai plusieurs jointures dans ma requête, mais j'ai cette dernière, dans laquelle son instruction ON sera différente, en fonction des données. Par exemple:

J'ai un enregistrement dans une table qui a un champ d'état, avec trois possibilités: CA, TX, FL.

Si la valeur est CA, l'instruction ON de ce JOIN doit être CA_Standard_table.field = myTable.field.

Si c'est TX, la déclaration sur de ce REJOIGNEZ devrait être TX_Standard_table.field = myTable.field

Et la même logique vaut pour FL.

Comment puis-je accomplir cela?

EDIT 2:

Voici le code de requête, le dernier JOIN est celui qui compte pour cela. Les trois possibilités de tables à se joindre à la déclaration ON sont:

  • EU_Accepted_Standards
  • CA_Accepted_Standards
  • NZ_Accepted_Standards

Il décidera de l'un d'eux, en fonction de laquelle des champs suivants sont vérifiés:

  • CAStandard: cela devrait prendre CA_Accepted_Standards.
  • EUSelStandard: cela devrait prendre EU_Accepted_Standards.
  • NZ_Accepted_Standards: il devrait prendre NZ_Accepted_Standards

Recherche

SELECT 

Projects.COMPAS_ID, 
Projects.[Opportunity Name], 
IIf([VolCap]=True,1) AS [Volume Cap], 
IIf([DelGuarantee]=True,1) AS [Delivery Guarantee], 
Projects.Tech_Level_Name, 
Counterparty.CPExpertise, 
Counterparty.CPFinStrength, 
Geographic_Location.Country_RiskLevel, 
Project_Stage_Risk.ProStaRiskLevel, 
Counterparty.CPExperience, 
Projects.Country_Name, 
IIf([EU ETS]=True,1) AS EU, 
IIf([CA ETS]=True,1) AS CA, 
IIf([NZ ETS]=True,1) AS NZ, 
IIf([Australia ETS]=True,1) AS Australia, 
IIf([CAProjectType] is not null, CA_Accepted_Projects.CAPTRiskLevel, 
     IIf([EUSelProjType] is not null, EU_ETS_Standards.EUPTRiskLevel, 
       IIf([NZSelProjType] is not null, NZ_Accepted_Projects.NZPTRiskLevel))) as [Risk Level], 
IIf([CAStandard] is not null, CA_Accepted_Standards.CAStanRiskLevel, 
     IIf([EUSelStandard] is not null, EU_Accepted_Standards.EUStanRiskLevel, 
       IIf([NZSelStandard] is not null, NZ_Accepted_Standards.NZStanRiskLevel))) as [Standard Risk] 




FROM 

Project_Stage_Risk 

INNER JOIN (((((((((Counterparty 

INNER JOIN Projects 
      ON Counterparty.CPID = Projects.[Counter Party]) 

INNER JOIN Geographic_Location 
      ON Projects.Country_Name = Geographic_Location.Country_Name) 

left JOIN CA_Accepted_Projects 
      ON Projects.CAProjectType = CA_Accepted_Projects.CA_ProjectTypes) 

left JOIN NZ_Accepted_Projects 
      ON Projects.NZSelProjType = NZ_Accepted_Projects.NZ_StandardID) 

left JOIN EU_ETS_Standards 
      ON Projects.EUSelProjType = EU_ETS_Standards.EU_StandardID) 

left JOIN CA_Accepted_Standards 
      ON Projects.CAStandard = CA_Accepted_Standards.ID) 

left JOIN NZ_Accepted_Standards 
      ON Projects.NZSelStandard = NZ_Accepted_Standards.ID) 

left JOIN EU_Accepted_Standards 
      ON Projects.EUSelStandard = EU_Accepted_Standards.ID) 

left join Emissions_Trading_Systems 
      ON Emissions_Trading_Systems.ETS = EU_Accepted_Standards.ETS) 

ON Project_Stage_Risk.ProStaID = Projects.[Project Stage]; 

Répondre

0

Vous pouvez créer une requête UNION que les syndicats ainsi les trois tables que vous souhaitez rejoindre conditionnellement, y compris une colonne « some_value » qui contient l'élément auquel vous voulez vous joindre. Essentiellement, pour chaque table que vous incluez dans l'UNION, définissez la valeur de la colonne "Some_Value" sur une valeur que vous pouvez utiliser dans une clause where pour différencier les choses. Créez ensuite une requête globale qui joint (dans votre exemple, table2) à la requête union et utilisez une clause WHERE pour limiter les enregistrements à ceux dont vous avez besoin.J'ai fait des choses similaires moi-même sur des projets dans le passé avec beaucoup de succès.

-2

Reliez les cinq tables ensemble et utilisez cette expression CASE dans la clause SELECT pour choisir le champ approprié dans toutes les tables.

SELECT 
    CASE table1.some_value 
     WHEN 'a' THEN table2.some_value 
     WHEN 'b' THEN table3.some_value 
     WHEN 'c' THEN table4.some_value 
     WHEN 'd' THEN table5.some_value 
    END 
+0

Je pense que je n'étais pas assez clair. J'ai une table que je dois joindre à 3 autres tables, mais MS Access ne me laissera pas insérer un alias à chaque JOIN, donc je ne peux pas les joindre tous les trois en même temps. –

+0

S'il vous plaît montrer votre code complet et le message d'erreur exacte que vous obtenez. –

+0

CASE ... WHEN n'est pas pris en charge par le moteur de base de données Access. – HansUp

0

Merci pour les réponses. Je sais que ce n'était pas bien expliqué cependant, mais à la fin, je pourrais résoudre ce problème en écrivant une sous-requête.

1

croiser joindre les deux ensembles dans une vue, mettre la condition dans la sélection. faire 2 vues de cette vue. Rejoignez les 2 vues ensemble.