代码之家  ›  专栏  ›  技术社区  ›  Ariod

SQL—外部表中要在主表中使用的所有值的关联

sql
  •  0
  • Ariod  · 技术社区  · 15 年前

    我有一个表包含销售记录,另一个表包含每个记录的附加详细信息。我需要做的是构建一个查询,该查询将查询第一个表,并为每个记录在虚拟列中列出其他详细信息,如下所示: “记录1的附加详细信息#1:一些附加详细信息;记录1的附加详细信息#2:更多附加详细信息;…”基本上,此列是所有附加字段记录值的串联。

    主表中的一条记录可以有多少附加详细信息(附加详细信息表中的记录)没有限制。

    你对如何做到这一点有什么建议吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Mladen Prajdic    15 年前

    对于SQL Server 2005及更高版本,您可以使用 method

        2
  •  0
  •   Quassnoi    15 年前

    在里面 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