views:

686

answers:

2

TSQL (as used in MS SQL Server 2000 and 2005) allows multiple JOIN clauses, one right after the other, no commas or parentheses needed. Try this in Access and it throws a fit: "Syntax error (missing operator) in query expression ... "

From what I have been able to gather out in Google-land, Access SQL wants parentheses to group the JOIN clauses. Most advice on how to accomplish this is to use the design view or the query wizard, and let Access figure out where to put the parentheses (that are NOT required in standard SQL). Problem is, I am so used to doing my SQL in a text editor (Notepad, SSMS, VS2005, whatever) that the design view and the wizard get in the way and make my skin crawl. Sometimes the wizards make bad assumptions about what to join if there are multiple possibilities, and I'm so used to doing it myself in TSQL that I'd rather leave the wizards out of it.

Isn't there a tool that will convert TSQL into Access SQL, or at least a set of rules on where to put the parentheses?

Example:

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
A: 

Yah, MS-Access is dumb.

I don't think one exists (probably not a huge market either to go from MS-SQL/TSQL to MS-Access). Typically, I use the Design View which is not really a wizard as far as I'm concerned. I then manually add the tables, and then (if I haven't created a proper Relations ship diagram, or something is a little funky) manually create the relationships in the Designer. After that, I check the query in the SQL view and correct as need be.

In the case of your example (as you indicated) you probably need the parenthesis, and will have to manually add them. You probably want something like this:

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

(if you have N inner joins, you will need N-1 open-parenthesis at the beginning, and one on ever end of the join; excluding the last one)

CodeSlave
Thanks. Unfortunately, now I get "Syntax Error in FROM Clause". I guess I'll give the Designer another shot.
Joe
Whoops... I think I put the open parenthesis in the wrong place. I've updated my example.
CodeSlave
Yes!! Thanks!! That was it, along with enclosing the hyphenated table names with brackets. I also discovered that my naming convention was throwing off the Designer. (It didn't like the PK of every table being just "ID", so it inserted way too many on clauses in its generated joins)
Joe
A: 

This works 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

As you can see, the tables to be joined are grouped together.

Remou