SQL - объединение всех значений в сторонней таблице для использования в первичной таблице - PullRequest
0 голосов
/ 14 июля 2009

У меня есть одна таблица с записями о продажах и другая таблица с дополнительными сведениями о каждой записи. Что мне нужно сделать, это создать запрос, который будет запрашивать первую таблицу и для каждой записи перечислять дополнительные детали в виртуальном столбце, например: «Дополнительные сведения № 1 для записи 1: некоторые дополнительные сведения; Дополнительные сведения № 2 для записи 1: дополнительные сведения; ...» По сути, этот столбец представляет собой объединение всех дополнительных значений записи поля.

Нет ограничений на количество дополнительных сведений (записей в таблице дополнительных сведений), которые может иметь одна запись из основной таблицы.

У вас есть предложения, как это сделать?

Ответы [ 2 ]

2 голосов
/ 14 июля 2009

для SQL Server 2005 и выше, вы можете использовать этот метод

0 голосов
/ 14 июля 2009

В MySQL:

SELECT  s.*,
        GROUP_CONCAT(detail)
FROM    sales s
JOIN    details d
ON      d.sale_id = s.id
GROUP BY
        s.id

В SQL Server:

SELECT  s.*,
        (
        SELECT  CASE WHEN ROW_NUMBER() OVER (ORDER BY sale_id) = 1 THEN ', ' ELSE '' END + detail
        FROM    details d
        WHERE   d.sale_id = s.id
        FOR XML PATH('')
        )
FROM    sales s

В PostgreSQL:

SELECT  s.*,
        ARRAY_TO_STRING (
        ARRAY
        (
        SELECT  detail
        FROM    details d
        WHERE   d.sale_id = s.id
        ), ', ')
        )
FROM    sales s

В Oracle:

WITH q AS (
        SELECT  d.sale_id, d.detail,
                ROW_NUMBER() OVER (PARTITION BY d.sale_id ORDER BY d.detail) AS rn
        FROM    sales s
        JOIN    details d
        ON      d.sale_id = s.id
        )
SELECT  *
FROM    (
        SELECT  *
        FROM    q
        MODEL
        PARTITION BY
                (sale_id)
        DIMENSION BY
                (rn)
        MEASURES
                (detail, detail AS group_concat, 0 AS mark)
        RULES UPDATE (
                group_concat[rn > 1] =  group_concat[CV() - 1] || ', ' || detail[CV()],
                mark[ANY] = PRESENTV(mark[CV() + 1], 0, 1)
                )
        )
WHERE   mark = 1
ORDER BY
        id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...