Consulta SQL para «concatenar en unirse a la»

Estoy usando un Sybase ASE de la base de datos.

Tengo dos tablas que parecen:

Tabla Shops:

---------------------
| ShopName | ShopID |
---------------------
| Sweetie  | 1      |
| Candie   | 2      |
| Sugarie  | 3      |
---------------------

Tabla Sweets:

----------------------
| SweetName | ShopID |
----------------------
| lolly     | 1      |
| redlolly  | 1      |
| greenloly | 1      |
| taffy     | 2      |
| redtaffy  | 2      |
| bluetaffy | 2      |
| choco     | 3      |
| mintchoco | 3      |
| milkchoco | 3      |
| gummybees | 3      |
----------------------

Quiero escribir una consulta que podría generar un resultado que parece:

-----------------------------------------------------
| ShopName | Sweets                                 |
-----------------------------------------------------
| Sweetie  | lolly, redlolly, greenlolly            |
| Candie   | taffy, redtaffy, bluetaffy             |
| Sugarie  | choco, mintchoco, milkchoco, gummybees |
-----------------------------------------------------

¿Cómo debo hacerlo? Necesito esto para un Sybase ASE de la base de datos. He probado el LIST() función, pero estoy recibiendo un error en eso. He comprobado su documentación, y resulta que esta función no está disponible en la ASE de la Edición.

Esto probablemente significa que habrá algunos «sql dinámico» involucrados (tengo muy poca idea de lo que eso significa). Alguien puede ayudar?

Yo podría desear ShopId en lugar de ShopName en la tabla de resultados… yo no lo sé todavía. Supongo que no habrá mucha diferencia. También, detrás de las comas en Sweets columna de resultados no es un problema. Todo lo que quiero es un no-espacio en blanco de separación.

Hmm suena a que quieres una cadena de agregación de la función. No estoy seguro de que las bases de datos que hacerlo de forma nativa, pero veo somtimes ver funciones definidas por el usuario para que (natuarlly que varía de un dmbs a otro). ¿Qué base de datos está utilizando?
Estoy usando syabse.
¿Qué errores hizo list() dar? No se que me pueden ayudar con Sybase problemas, pero alguien que puede reconocer el mensaje de error.
El error fue que LIST() función no se encuentra, y con razón: estoy usando Sybase ASE edition, que no tienen esta función (su documentación, así lo dice). Esto probablemente tendrá algunos T-SQL mumbo jumbo supongo, pero no tengo idea de cómo hacer eso..
La función LIST() sólo funciona para Sybase IQ y no para Sybase ASE.

OriginalEl autor jrharshath | 2010-09-17

5 Kommentare

  1. 5

    Tendrás que especificar qué DBMS que está utilizando.

    De MySQL GRUPO CONCAT es exactamente lo que usted necesita.

    SELECT ShopName, GROUP_CONCAT(SweetName SEPARATOR ", ")
    FROM Shops a
    JOIN Sweets b
    ON a.ShopID = b.ShopID
    GROUP BY ShopName
    Y Oracle ha wmsys.wm_concat, aunque parece ser indocumentados. Yo nunca he usado yo, pero lo encontró bastante rápidamente. Otro de Oracle solución utilizando connect by: halisway.blogspot.com/2006/08/…
    Necesito hacer esto con sybase ASE, así que esto no va a funcionar para mí… Sybase tiene una LISTA() función que hace esto, pero no está presente en la ASE de la edición.
    mi google-fu revela este enlace (projectdmx.com/tsql/rowconcatenate.aspx). Se puede convertir esto en SQL necesito en mi caso?

    OriginalEl autor Konerak

  2. 2

    Es una consulta de referencias cruzadas y es imposible con Sybase ASE en una consulta.

    Puede crear un procedimiento almacenado con la tabla temporal, rellenar con el cursor y seleccionar de esta tabla temporal.

    OriginalEl autor kolchanov

  3. 1

    He probado esto en SQL Server, pero espero que también trabajo en Sybase. Si no, tal vez va a llegar lo suficientemente cerca como para resolverlo.

    Si puedo crear esta función:

    CREATE FUNCTION SweetsList(@shopID int)
    RETURNS varchar(500)
    AS
    BEGIN
    
        DECLARE @list varchar(500)
    
        SELECT @list = COALESCE(@list+', ','') + SweetName
        FROM Sweets
        WHERE ShopID = @shopID
    
        RETURN @list
    END

    Puedo ejecutar esta consulta y obtener los resultados que desea:

    SELECT ShopName, dbo.SweetsList(ShopID) AS Sweets
    FROM Shops

    Espero que esto ayude.

    Aquí estoy teniendo el mismo problema. Para mí (Sybase ASE 15.0) que no funciona. Por alguna razón que sólo devuelve la última fila. Esta es una versión dependiente de la cosa? O una opción?

    OriginalEl autor Jeff Ogata

  4. 1

    Por desgracia, un método en a la deriva del respuesta no funcionan con la instrucción select para Sybase ASE, variable @lista no se actualizan en cada fila, sólo funciona con la última fila. Pero debido a la actualización de realizar para cada fila de la tabla y el tamaño no es grande, podría hacerlo con la instrucción update. Pequeño ejemplo:

        declare @list varchar(500)
    
        update Sweets
        set @list = @list + SweetName + ', ' 
        where ShopID = 1
    
        select SUBSTRING(@list, 1, Len(@list) - 2)

    P. S. Como para mí, el cursor no está buena manera…

    OriginalEl autor Alek

  5. 0

    Obras en Sybase ASE…

    CREATE FUNCTION SweetsList(@SN varchar(10))
    returns varchar(255)
    AS
    DECLARE @SwNList varchar(255)
    DECLARE @FetchSwN varchar(55)
    DECLARE @Status INT, @Error INT
    
    DECLARE ListCurs CURSOR FOR
    SELECT SweetName
      FROM Sweets AS SW
     JOIN Shops AS SH
      ON SH.ShopID = SW.ShopID
     WHERE SH.ShopName = @SN
    FOR READ ONLY
    
    OPEN ListCurs
    SELECT @Status = 0
    WHILE @Status = 0
    BEGIN
        FETCH ListCurs INTO @FetchSwN
    
        SELECT @Status = @@SQLSTATUS
    
        IF @Status = 0 
        BEGIN
           SELECT  @SwNList = CASE WHEN @SwNList IS NULL THEN '' ELSE @SwNList + ', ' END + @FetchSwN
        END
    END
    CLOSE ListCurs
    RETURN (@SwNList)
    go

    A continuación, ejecutar …

    SELECT ShopName, dbo.SweetsList(ShopName) AS Sweets FROM Shops

    OriginalEl autor Bud

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea