2015-04-09 1 views
0

J'essaie de faire des jointures compliquées dans la vue sql en accès et il est vraiment difficile de savoir pourquoi je reçois des erreurs. Je suis plus compétent dans l'utilisation des jointures SQL dans SQL lui-même et la vue SQL de l'accès est vraiment confuse lorsque je donne des erreurs. Je n'ai aucune idée de ce que je dois faire pour corriger cette erreur. S'il vous plaît voir ci-dessous.Erreur de syntaxe sur l'opération de jointure - vue sql dans l'accès 2013

SELECT Table1.PAT_NAME AS PATNM, 
     Table1.PAT_MRN_ID AS MRN, 
     Table2.Start_Date AS StartDT, 
     Table2.END_date AS ENDDT, 
     Table2.episode_ID AS EPSDID, 
     Table2.POS_NAME AS POS, 
     Table3.READMITDT AS READMITD 
FROM Table2 
    LEFT JOIN (Table1 ON Table2.PAT_MRN_ID = Table1.PAT_MRN_ID) 
    JOIN (Table3 ON Table1.PAT_ID = Table3.PATIDR AND 
     (Table3.READMITDT <= dateadd("d", 1, isnull(Table2.END_DATE,NOW()) 
      OR Table3.READMITDT < dateadd("d", 30, Table2.START_DATE)) 
      AND Table3.READMITDT >= Table2.start_date)) 

Répondre

0

Je ne suis pas familier avec ms access sql. mais je pense que LEFT JOIN devrait être LEFT OUTER JOIN et vos parenthèses sont fausses. après inscription support doit être ouvert après les tables avant clause ON regard exemple suivant

DE Tableau2 LEFT JOIN (Tableau 1 SUR Table2.PAT_MRN_ID = Table1.PAT_MRN_ID) devrait être le changement comme
DE GAUCHE Tableau2 OUTER JOIN Tableau 1 ON (Table2.PAT_MRN_ID = Table1.PAT_MRN_ID)

+0

Merci, j'ai fait les changements, mais maintenant il me dit que j'ai un opérateur manquant et donne l'instruction entière, donc difficile de dire où se trouve l'opérateur manquant. –

+0

il est préférable d'utiliser la clause WHERE après l'opération de jointure. retirer 'et' REJOIGNEZ ON Table3 (Table1.PAT_ID = Table3.PATIDR) ET (Table3.READMITDT <= dateadd ("d", 1, isnull (Table2.END_DATE, NOW()) OU Table3.READMITDT < dateadd ("d", 30, Table2.START_DATE) ET Table3.READMITDT> = Table2.start_date)) devrait être REJOIGNEZ ON Table3 (Table1.PAT_ID = Table3.PATIDR) ** OÙ ** (Table3.READMITDT <= dateadd ("d", 1, isnull (Table2.END_DATE, MAINTENANT()) OU Table3.READMITDT = Table2.start_date)) –

0

Je l'ai exécuté à travers un vérificateur de syntaxe https://sql.treasuredata.com/. Cette version ne donne aucune erreur de syntaxe.

SELECT 
    Table1.PAT_NAME AS PATNM 
,Table1.PAT_MRN_ID AS MRN 
,Table2.Start_Date AS StartDT 
,Table2.END_date AS ENDDT 
,Table2.episode_ID AS EPSDID 
,Table2.POS_NAME AS POS 
,Table3.READMITDT AS READMITD 
FROM 
    Table2 
    LEFT OUTER JOIN Table1 ON (Table2.PAT_MRN_ID = Table1.PAT_MRN_ID) 
    JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) AND 
     (Table3.READMITDT <= dateadd("d", 1, isnull(Table2.END_DATE,NOW()) 
     OR Table3.READMITDT < dateadd("d", 30, Table2.START_DATE) 
     AND Table3.READMITDT >= Table2.start_date)) 
+0

Merci - j'ai essayé bo et obtenant toujours l'erreur de syntaxe dans la clause From. J'aime le laisser comme une instruction where si cela me donne les mêmes résultats que j'ai en SQL. En outre, je dois laisser cette parenthèse supplémentaire autour des deux instructions avec OR parce que cela fait partie de l'instruction AND plus grande. Il doit être juste OU de ces deux.Voici où je suis à JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) O WH (Table3.READMITDT <= dateadd ("d", 1, isnull (Table2.END_DATE, MAINTENANT()) OU Table3.READMITDT = Table2.start_date –

+0

Désolé pour le code ci-dessus .. Voici à nouveau l'exemple JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) WHERE (Table3.READMITDT <= dateadd ("d", 1, isnull (Table2.END_DATE, MAINTENANT()) OU TABLE3.READMITDT = Table2.start_date –

0
it is better to use WHERE Clause after join operation. remove 'and' 

JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) AND 
     (Table3.READMITDT <= dateadd("d", 1, isnull(Table2.END_DATE,NOW()) 
     OR Table3.READMITDT < dateadd("d", 30, Table2.START_DATE) 
     AND Table3.READMITDT >= Table2.start_date)) 

should be 


JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) 
WHERE 
     (Table3.READMITDT <= dateadd("d", 1, isnull(Table2.END_DATE,NOW()) 
     OR Table3.READMITDT < dateadd("d", 30, Table2.START_DATE) 
     AND Table3.READMITDT >= Table2.start_date)) 
+0

Je l'ai compris maintenant Merci à tous! –

1

Voici un problème ...

JOIN (Table3 ON Table1.PAT_ID = Table3.PATIDR 
^^^^ 

Access SQL n'accepte pas JOIN seul. Vous devez toujours spécifier le type de jointure souhaité: INNER JOIN; LEFT JOIN; ou RIGHT JOIN. Utilisez la vue de conception du Concepteur de requêtes (au lieu de Vue SQL) pour configurer vos jointures. Le concepteur de requêtes connaît les règles de syntaxe qui maintiennent le moteur db heureux. Plus tard, vous pouvez revenir à SQL View pour voir comment vos jointures valides sont représentées. L'accès SQL reconnaît LEFT OUTER JOIN comme synonyme de LEFT JOIN et RIGHT OUTER JOIN pour RIGHT JOIN Lorsque vous modifiez la requête dans le concepteur de requêtes, il est probable qu'il supprime OUTER, mais vous pouvez le rajouter sans interrompre une requête en cours. Envisagez de déplacer les conditions DateAdd à la clause WHERE de votre requête.

+0

Merci pour l'info.J'utilise d'abord le concepteur de requêtes.Je dois avoir simplement omis les types de jointure quand je modifiais pour t L'exemple, mais c'est bon à savoir .. Je ne le savais pas. Cela devient compliqué après m'être éloigné du concepteur de requêtes. Les emplacements des parenthèses sont toujours confus. J'ai fini par mettre dateadd dans ma clause where et cela a semblé rendre les choses moins confuses. Merci! Je suis retourné au concepteur de requêtes à plusieurs reprises et j'ai ajouté des phrases en une à la fois jusqu'à ce que je m'en rende compte. Celui-ci m'a pris une bonne partie de la journée pour bien faire les choses! –