2017-09-07 2 views
0

Je suis en train de commettre une erreur en essayant d'exécuter l'instruction SQL ci-dessous. Je ne sais pas s'il y a un autre mot réservé ou des parenthèses nécessaires autour de O WH, mais je manque d'idées.Message d'erreur - Msg 156, niveau 15, état 1, syntaxe incorrecte près du mot clé 'WHERE'

Je reçois l'erreur - "Msg 156, niveau 15, état 1, ligne 20 Syntaxe incorrecte près du mot clé" WHERE "."

Quelqu'un peut-il m'aider à comprendre comment corriger cette erreur?

Merci d'avance!

SELECT dbo.PURCHASING_DETAIL.ID 
    ,dbo.SCA_SS_INVOICELINESALL.* 
    ,dbo.SCA_SS_INVOICESALL.* 
    ,dbo.PURCHASING_DETAIL.QUOTEDPRICE 
    ,dbo.PURCHASING_DETAIL.GLACCT 
    ,dbo.PURCHASING_DETAIL.[PO DATE] 
FROM dbo.PURCHASING_DETAIL 
INNER JOIN (
    (
     dbo.SCA_SS_INVOICELINESALL INNER JOIN dbo.SCA_SS_INVOICESALL ON dbo.SCA_SS_INVOICELINESALL.INVOICESALLID = dbo.SCA_SS_INVOICESALL.INVOICESALLID 
     ) INNER JOIN dbo.PURCHASING_DETAIL ON (dbo.SCA_SS_INVOICELINESALL.SUPPARTNUM = dbo.PURCHASING_DETAIL.SUPPARTNUM) 
     AND (dbo.SCA_SS_INVOICESALL.INVOICENUMBER = dbo.PURCHASING_DETAIL.INVOICENUM) 
    ) 
INNER JOIN dbo.SCA_SS_LOCATION ON (dbo.SCA_SS_INVOICESALL.SHIPTOADDRID = dbo.SCA_SS_LOCATION.LOCATIONID) 
    AND (dbo.PURCHASING_DETAIL.FACILITY = dbo.SCA_SS_LOCATION.FACILITYID) 
WHERE (dbo.PURCHASING_DETAIL.[6DIGIT] = '50002') 
    AND DATEDIFF(month, [PO DATE], GETDATE()) <= 12 
+1

Il est la parenthèse autour de la INNER JOIN ce thats le problème, je pense – Steve

+0

Retirez toutes les parenthèses (il suffit de laisser l'un pour DATEDIFF() ET GETDATE() – etsa

+0

@etsa Non Regardez attentivement. 'INNER JOIN ((dbo.SCA_SS_INVOICELINESALL INNER JOIN dbo.SCA_SS_INVOICESAL' – lad2025

Répondre

0

Vous avez également des expressions JOIN qui référencent les tables qui ne sont pas dans la jointure. Ceux-ci devraient probablement être dans la clause WHERE. Ça marcherait, mais c'est vraiment difficile à lire. Je suis également d'accord que vous devez supprimer toutes les parenthèses.

De plus, comme je l'ai mentionné dans un commentaire, vous avez deux fois Purchasing_Detail.

Essayez ceci:

SELECT dbo.PURCHASING_DETAIL.ID, 
     dbo.SCA_SS_INVOICELINESALL.*, 
     dbo.SCA_SS_INVOICESALL.*, 
     dbo.PURCHASING_DETAIL.QUOTEDPRICE, 
     dbo.PURCHASING_DETAIL.GLACCT, 
     dbo.PURCHASING_DETAIL.[PO DATE] 

FROM dbo.SCA_SS_INVOICELINESALL 

    INNER JOIN dbo.SCA_SS_INVOICESALL 
     ON dbo.SCA_SS_INVOICELINESALL.INVOICESALLID = dbo.SCA_SS_INVOICESALL.INVOICESALLID 

    INNER JOIN dbo.PURCHASING_DETAIL 
     ON dbo.SCA_SS_INVOICELINESALL.SUPPARTNUM = dbo.PURCHASING_DETAIL.SUPPARTNUM 

    INNER JOIN dbo.SCA_SS_LOCATION 
     ON (dbo.SCA_SS_INVOICESALL.SHIPTOADDRID = dbo.SCA_SS_LOCATION.LOCATIONID) 

WHERE (dbo.PURCHASING_DETAIL.[6DIGIT] = '50002') 
    AND (dbo.SCA_SS_INVOICESALL.INVOICENUMBER = dbo.PURCHASING_DETAIL.INVOICENUM) 
    AND (dbo.PURCHASING_DETAIL.FACILITY = dbo.SCA_SS_LOCATION.FACILITYID) 
    AND DATEDIFF(month,[PO DATE], GETDATE()) <= 12 
+1

Cela a résolu mes (multiples) problèmes. Merci pour le reformatage aussi. J'apprends encore comment structurer les instructions SQL –

+0

Content de vous aider. Bonne chance. –

+0

Je voudrais déplacer AND (dbo.SCA_SS_INVOICESALL.INVOICENUMBER = dbo.PURCHASING_DETAIL.INVOICENUM) ET (dbo.PURCHASING_DETAIL.FACILITY = dbo.SCA_SS_LOCATION.FACILITYID) de WHERE à JOIN clauses – etsa

0

Vous avez des JOIN inutiles (comme le double emploi INNER JOIN dbo.PURCHASING_DETAIL) et une parenthèse inutile dans votre requête. Essayez ceci:

SELECT dbo.PURCHASING_DETAIL.ID, 
     dbo.SCA_SS_INVOICELINESALL.*, 
     dbo.SCA_SS_INVOICESALL.*, 
     dbo.PURCHASING_DETAIL.QUOTEDPRICE, 
     dbo.PURCHASING_DETAIL.GLACCT, 
     dbo.PURCHASING_DETAIL.[PO DATE] 
FROM dbo.PURCHASING_DETAIL 
JOIN dbo.SCA_SS_INVOICELINESALL 
    ON dbo.SCA_SS_INVOICELINESALL.SUPPARTNUM = dbo.PURCHASING_DETAIL.SUPPARTNUM 
JOIN dbo.SCA_SS_INVOICESALL  
    ON dbo.SCA_SS_INVOICESALL.INVOICENUMBER = dbo.PURCHASING_DETAIL.INVOICENUM 
JOIN dbo.SCA_SS_LOCATION 
    ON dbo.SCA_SS_INVOICESALL.SHIPTOADDRID = dbo.SCA_SS_LOCATION.LOCATIONID AND 
     dbo.PURCHASING_DETAIL.FACILITY = dbo.SCA_SS_LOCATION.FACILITYID 
WHERE dbo.PURCHASING_DETAIL.[6DIGIT] = '50002' 
     AND DATEDIFF(month,[PO DATE], GETDATE()) <= 12 
+0

Cela fonctionnera, mais je n'aime pas le fait que cette dernière instruction "ON" référence toujours deux tables différentes liées à la table jointe. –

+0

@JohnPasquet, ce n'est pas un problème, car parfois vous avez (vraiment) besoin de faire ce genre de vérification. –