2009-04-27 17 views
8

TSQL (como se usa en MS SQL Server 2000 y 2005) permite múltiples cláusulas JOIN, una después de la otra, sin comas ni paréntesis necesarios. Pruebe esto en Access y arroja un ajuste: "Error de sintaxis (operador faltante) en la expresión de consulta ..."Convertir TSQL a MS-Access SQL

Por lo que he podido reunir en Google-land, Access SQL quiere que los paréntesis agrupen el Cláusulas JOIN. La mayoría de los consejos sobre cómo lograr esto es usar la vista de diseño o el asistente de consultas, y dejar que Access averigüe dónde colocar los paréntesis (que NO son necesarios en el SQL estándar). El problema es que estoy tan acostumbrado a hacer mi SQL en un editor de texto (Bloc de notas, SSMS, VS2005, lo que sea) que la vista de diseño y el asistente se ponen en el camino y hacen que mi piel se arrastre. A veces los asistentes hacen suposiciones erróneas sobre a qué unirse si hay múltiples posibilidades, y estoy tan acostumbrado a hacerlo en TSQL que preferiría dejar a los asistentes fuera de él.

¿No hay una herramienta que convierta TSQL en Access SQL, o al menos un conjunto de reglas sobre dónde poner los paréntesis?

Ejemplo:

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

Se encontró que el uso de la sintaxis compatible con SQL Server (ANSI 92) tampoco es de ayuda. – JeffO

Respuesta

2

Yah, MS-Access es mudo.

No creo que exista (probablemente tampoco sea un gran mercado para ir de MS-SQL/TSQL a MS-Access). Normalmente, utilizo Design View, que en realidad no es un asistente en lo que a mí respecta. A continuación, agrego manualmente las tablas y luego (si no he creado un diagrama de envío de relaciones adecuado, o algo es un poco raro) crear manualmente las relaciones en el Diseñador. Después de eso, verifico la consulta en la vista de SQL y corrijo según sea necesario.

En el caso de su ejemplo (como ha indicado) probablemente necesite el paréntesis y tendrá que agregarlos manualmente. Es posible que desee algo como esto:

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 

(si tiene une N interno, necesitará N-1 paréntesis de apertura al comienzo, y uno en cada vez extremo de la combinación; excluyendo el último)

+0

Gracias. Desafortunadamente, ahora recibo "Error de sintaxis en la cláusula FROM". Creo que le daré otra oportunidad al diseñador. –

+0

Vaya ... creo que puse el paréntesis abierto en el lugar equivocado. He actualizado mi ejemplo. – BIBD

+1

¡Sí! ¡¡Gracias!! Eso fue todo, junto con los nombres de las tablas con guiones con corchetes. También descubrí que mi convención de nombres estaba arrojando al Diseñador. (No me gusta que el PK de cada tabla sea solo "ID", por lo que inserta demasiadas cláusulas en sus uniones generadas) –

0

Esto funciona en 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 

Como se puede ver, las tablas a unir se agrupan juntos.