none
Error con consulta RRS feed

  • Pregunta

  • Buenas... Espero alguien pueda ayudarme... Tengo la siguiente consulta:

    $sql = "WITH result (SELECT agd.name "
                    . " FROM " . DB_PREFIX . "attribute_group_description agd"
                    . " WHERE agd.attribute_group_id = a.attribute_group_id"
                    . " AND agd.language_id = '" . (int)$this->config->get('config_language_id') . "')"
                    . " AS attribute_group FROM " . DB_PREFIX ."attribute a"
                    . " LEFT JOIN " . DB_PREFIX . "attribute_description ad"
                    . " ON (a.attribute_id = ad.attribute_id)"
                    . " WHERE ad.language_id = '" . (int)$this->config->get('config_language_id') . "'";

    Que me arroja el siguente error:

    Error: SQLSTATE: 42000 CODE: 156 MESSAGE: [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near the keyword 'SELECT'. SQLSTATE: 42000 CODE: 102 MESSAGE: [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near ')'.
    WITH result (SELECT agd.name FROM attribute_group_description agd WHERE agd.attribute_group_id = a.attribute_group_id AND agd.language_id = '2') AS attribute_group FROM attribute a LEFT JOIN attribute_description ad ON (a.attribute_id = ad.attribute_id) WHERE ad.language_id = '2' ORDER BY ad.name ASC LIMIT 0,20

    Soy nuevo en esto de las consultas SQL, espero alguien pueda ayudarme..

    De Antemano muchas gracias :)

    PD: sql server 2008

    domingo, 23 de septiembre de 2012 18:59

Respuestas

  • En Sql Server no existe la clausula LIMIT, debes usar TOP http://technet.microsoft.com/es-es/library/ms189463.aspx

    Estas intentando hacer una query recursiva? por eso el with? seria bueno que ejecutes primero tu query en el SSMS y si funciona intentes generarlo desde tu front-end


    domingo, 23 de septiembre de 2012 19:44
  • Hola,

    Como menciona Ronald, la clausula LIMIT es para MySql, su equivalente en Sql Server es la clausula TOP.

    Mi pregunta es porque quieres utilizar un Common Table Expression (CTE), no le veo la utilidad?

    Revisando la setencia que genera tu aplicacion veo que aun no manejas la sintaxis correcta de como generar un CTE, para ello te recomiendo leer el siguiente articulo(Using Common Table Expressions : http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx), viendo la estructura de tu query, veo que lo que intentabas realizar era un table expression(Table Expressions in SQL server : http://www.techbubbles.com/sql-server/table-expressions-in-sql-server/).

    Antes entrar a tu query y dar mis observaciones , debo enfatizar las palabras de RONALD, es importante que pruebes primero los querys en SQL server por medio SSMS.

    Adjunto un poco de observaciones y un query recomendado.

    --Este query no implementa bien los CTE.
    --La forma que se a estructurado el query no es la correcta
    --Segun veo el CTE no tiene sentido, porque al final el resultado 
    --o el campo que vas a retornar es de attribute_description ad
    --Por solo ver no necesitas hacer un join con attribute_group_description
    --porque attribute y attribute_description se relacionan directamente
    --Recuerda que la clausula LEFT join realiza una comparacion entre dos tablas
    --pero retorna todos los registro de la tabla de la derecha
    --para ello creo que deberia aplicar mas un inner join
    --Lo del Limit lo resuelves con TOP 20
    WITH result (
    SELECT agd.name 
    FROM attribute_group_description agd 
    WHERE agd.attribute_group_id = a.attribute_group_id AND agd.language_id = '2'
    ) AS attribute_group FROM attribute a LEFT JOIN attribute_description ad ON (a.attribute_id = ad.attribute_id) 
    WHERE ad.language_id = '2' ORDER BY ad.name ASC LIMIT 0,20
    
    
    --Query recomendado si lo que necesitas son todas las descripciones de los atributos
    --que tiene descripcion
    SELECT TOP 20 ad.name
    FROM attribute a INNER JOIN attribute_description ad ON (a.attribute_id = ad.attribute_id) 
    WHERE ad.language_id = '2' 
    ORDER BY ad.name
    
    --Si lo que necesitas son todos los atributos que no tiene descripcion
    --si haces un left join
    SELECT TOP 20 a.name--Debe existir el campo name en attribute
    FROM attribute a LEFT JOIN attribute_description ad ON (a.attribute_id = ad.attribute_id) 
    WHERE ad.attribute_id is null AND
          ad.language_id = '2'  --Me imagino que haces estos para poder manejar un sistema multi
    	                         --lenguaje y necesitas saber que atributos no tiene traduccion 
    							 --en un lenguaje especifico
    --ORDER BY ad.name



    Ahias Portillo

    lunes, 24 de septiembre de 2012 1:03

Todas las respuestas

  • En Sql Server no existe la clausula LIMIT, debes usar TOP http://technet.microsoft.com/es-es/library/ms189463.aspx

    Estas intentando hacer una query recursiva? por eso el with? seria bueno que ejecutes primero tu query en el SSMS y si funciona intentes generarlo desde tu front-end


    domingo, 23 de septiembre de 2012 19:44
  • Hola,

    Como menciona Ronald, la clausula LIMIT es para MySql, su equivalente en Sql Server es la clausula TOP.

    Mi pregunta es porque quieres utilizar un Common Table Expression (CTE), no le veo la utilidad?

    Revisando la setencia que genera tu aplicacion veo que aun no manejas la sintaxis correcta de como generar un CTE, para ello te recomiendo leer el siguiente articulo(Using Common Table Expressions : http://msdn.microsoft.com/en-us/library/ms190766(v=sql.105).aspx), viendo la estructura de tu query, veo que lo que intentabas realizar era un table expression(Table Expressions in SQL server : http://www.techbubbles.com/sql-server/table-expressions-in-sql-server/).

    Antes entrar a tu query y dar mis observaciones , debo enfatizar las palabras de RONALD, es importante que pruebes primero los querys en SQL server por medio SSMS.

    Adjunto un poco de observaciones y un query recomendado.

    --Este query no implementa bien los CTE.
    --La forma que se a estructurado el query no es la correcta
    --Segun veo el CTE no tiene sentido, porque al final el resultado 
    --o el campo que vas a retornar es de attribute_description ad
    --Por solo ver no necesitas hacer un join con attribute_group_description
    --porque attribute y attribute_description se relacionan directamente
    --Recuerda que la clausula LEFT join realiza una comparacion entre dos tablas
    --pero retorna todos los registro de la tabla de la derecha
    --para ello creo que deberia aplicar mas un inner join
    --Lo del Limit lo resuelves con TOP 20
    WITH result (
    SELECT agd.name 
    FROM attribute_group_description agd 
    WHERE agd.attribute_group_id = a.attribute_group_id AND agd.language_id = '2'
    ) AS attribute_group FROM attribute a LEFT JOIN attribute_description ad ON (a.attribute_id = ad.attribute_id) 
    WHERE ad.language_id = '2' ORDER BY ad.name ASC LIMIT 0,20
    
    
    --Query recomendado si lo que necesitas son todas las descripciones de los atributos
    --que tiene descripcion
    SELECT TOP 20 ad.name
    FROM attribute a INNER JOIN attribute_description ad ON (a.attribute_id = ad.attribute_id) 
    WHERE ad.language_id = '2' 
    ORDER BY ad.name
    
    --Si lo que necesitas son todos los atributos que no tiene descripcion
    --si haces un left join
    SELECT TOP 20 a.name--Debe existir el campo name en attribute
    FROM attribute a LEFT JOIN attribute_description ad ON (a.attribute_id = ad.attribute_id) 
    WHERE ad.attribute_id is null AND
          ad.language_id = '2'  --Me imagino que haces estos para poder manejar un sistema multi
    	                         --lenguaje y necesitas saber que atributos no tiene traduccion 
    							 --en un lenguaje especifico
    --ORDER BY ad.name



    Ahias Portillo

    lunes, 24 de septiembre de 2012 1:03