2009-04-27 8 views
8

TSQL (wie in MS SQL Server 2000 und 2005 verwendet) erlaubt mehrere JOIN-Klauseln, eine direkt nach der anderen, keine Kommas oder Klammern erforderlich. Versuchen Sie dies in Access und es wirft eine Anpassung: "Syntaxfehler (fehlender Operator) in Abfrageausdruck ..."Konvertieren von TSQL in MS-Access SQL

Von dem, was ich in Google-Land sammeln konnte, möchte Access SQL Klammern gruppieren JOIN-Klauseln. Die meisten Ratschläge, wie dies zu erreichen ist, verwenden Sie die Entwurfsansicht oder den Abfrageassistenten und lassen Sie Access herausfinden, wohin die Klammern gesetzt werden sollen (die in Standard-SQL NICHT benötigt werden). Das Problem ist, ich bin so daran gewöhnt, meine SQL in einem Texteditor (Notepad, SSMS, VS2005, was auch immer) zu machen, dass die Designansicht und der Assistent in die Quere kommen und mein Skin kriechen. Manchmal machen die Assistenten schlechte Annahmen über das, was beitreten soll, wenn es mehrere Möglichkeiten gibt, und ich bin es so gewohnt, es selbst in TSQL zu tun, dass ich lieber die Assistenten draus lassen würde.

Gibt es kein Tool, das TSQL in Access SQL konvertiert, oder zumindest eine Reihe von Regeln, wo die Klammern gesetzt werden?

Beispiel:

SELECT ... 
FROM Participant PAR 
    INNER JOIN Individual IND 
     ON PAR.APETSID = IND.APETSID 
    INNER JOIN Ethnicity ETH 
     ON IND.EthnicityID = ETH.ID 
    INNER JOIN Education EDU 
     ON IND.EducationID = EDU.ID 
    INNER JOIN Marital MAR 
     ON IND.Marital = MAR.ID 
    INNER JOIN Participant-Probation PXP 
     ON PAR.ID = PXP.ParticipantID 
    INNER JOIN Probation PBN 
     ON PXP.ProbationID = PBN.ID 
    INNER JOIN Class-Participant CXP 
     ON PAR.ID = CXP.ParticipantID 
    INNER JOIN Class CLS 
     ON CXP.ClassID = CLS.ID 
    INNER JOIN Official OFR 
     ON PAR.ReferringPO = OFR.ID 
    INNER JOIN Participant-Official PXO 
     ON PAR.ID = PXO.ParticipantID 
    INNER JOIN Official OFA 
     ON PXO.OfficialID = OFA.ID 
+0

Gefunden, dass die Verwendung der SQL Server Compatible Syntax (ANSI 92) auch nicht hilft. – JeffO

Antwort

2

Yah, MS-Access ist stumm.

Ich glaube nicht, dass es einen gibt (wahrscheinlich kein riesiger Markt, um von MS-SQL/TSQL zu MS-Access zu gehen). Normalerweise verwende ich die Design-Ansicht, die für mich nicht wirklich ein Assistent ist. Ich füge dann manuell die Tabellen hinzu und erstelle dann (wenn ich kein korrektes Beziehungsschiffendiagramm erstellt habe, oder etwas ist etwas unkonventionell) die Beziehungen im Designer manuell. Danach überprüfe ich die Abfrage in der SQL-Ansicht und korrigiere gegebenenfalls.

Im Fall Ihres Beispiels (wie Sie angegeben haben) benötigen Sie wahrscheinlich die Klammer, und müssen sie manuell hinzufügen. Sie wollen wahrscheinlich etwas wie folgt aus:

SELECT ... 
FROM (((Participant PAR 
    INNER JOIN Individual IND 
     ON PAR.APETSID = IND.APETSID) 
    INNER JOIN Ethnicity ETH 
     ON IND.EthnicityID = ETH.ID) 
    INNER JOIN Education EDU 
     ON IND.EducationID = EDU.ID) 
    INNER JOIN Marital MAR 
     ON IND.Marital = MAR.ID 

(wenn Sie N innere Joins haben, müssen Sie N-1 öffnende Klammer am Anfang, und man auf immer von der Join-Ende, mit Ausnahme der letzten)

+0

Danke. Leider bekomme ich jetzt "Syntax Error in FROM Clause". Ich schätze, ich werde dem Designer noch eine Chance geben. –

+0

Whoops ... Ich denke, ich habe die offene Klammer an die falsche Stelle gesetzt. Ich habe mein Beispiel aktualisiert. – BIBD

+1

Ja !! Vielen Dank!! Das war es, zusammen mit dem Einfügen der Bindestrichnamen in eckige Klammern. Ich entdeckte auch, dass meine Namenskonvention den Designer abwarf. (Es hat nicht gefallen, dass der PK jeder Tabelle nur "ID" ist, also hat er viel zu viele Klauseln in seine generierten Joins eingefügt) –

0

Dies funktioniert in Access.

SELECT * 
FROM (((Individual AS IND 

INNER JOIN Ethnicity AS ETH 
    ON IND.EthnicityID = ETH.ID) 

INNER JOIN Education AS EDU 
    ON IND.EducationID = EDU.ID) 

INNER JOIN Marital AS MAR 
    ON IND.Marital = MAR.ID) 

INNER JOIN (((((((Participant AS PAR 

    INNER JOIN Official AS OFR 
     ON PAR.ReferringPO = OFR.ID) 

    INNER JOIN [Class-Participant] AS CXP 
     ON PAR.ID = CXP.ParticipantID) 

    INNER JOIN Class AS CLS 
     ON CXP.ClassID = CLS.ID) 

    INNER JOIN [Participant-Official] AS PXO 
     ON PAR.ID = PXO.ParticipantID) 

    INNER JOIN Official AS OFA 
     ON PXO.OfficialID = OFA.ID) 

    INNER JOIN [Participant-Probation] AS PXP 
     ON PAR.ID = PXP.ParticipantID) 

    INNER JOIN Probation AS PBN 
     ON PXP.ProbationID = PBN.ID) 

ON IND.APETSID = PAR.APETSID 

Wie Sie sehen können, sind die zu verbindenden Tabellen gruppiert.