PostgreSQL-如何使用来自其他表的联接合并多行数据

PostgreSQL-如何使用来自其他表的联接合并多行数据,postgresql,Postgresql,我正在使用postgresql 9.6,希望将多行数据合并为一行。我使用了4个表(表格式和数据无法更改) 桌子是- "id" int4 DEFAULT nextval('product_a_seq'::regclass) NOT NULL, "name" varchar(255) COLLATE "default", "organization_id" int4, "description" text COLLATE "default", "image" varchar(255) COLLATE

我正在使用postgresql 9.6,希望将多行数据合并为一行。我使用了4个表(表格式和数据无法更改)

桌子是-

"id" int4 DEFAULT nextval('product_a_seq'::regclass) NOT NULL,
"name" varchar(255) COLLATE "default",
"organization_id" int4,
"description" text COLLATE "default",
"image" varchar(255) COLLATE "default" DEFAULT 'https://abcd.com'::character varying,
"deleted" bool,
"price" float4,
"currency_id" int4,
CONSTRAINT "product_pkey" PRIMARY KEY ("id")
)

CREATE TABLE "public"."product_asset" (
"id" int4 DEFAULT nextval('product_asset_a_seq'::regclass) NOT NULL,
"product_id" int4,
"asset_type" varchar(255) COLLATE "default",
"asset_url" text COLLATE "default",
"asset_value" text COLLATE "default",
"asset_name" text COLLATE "default",
CONSTRAINT "product_asset_pkey" PRIMARY KEY ("id")
)

CREATE TABLE "public"."user" (
"id" int4 DEFAULT nextval('istar_user_a_seq'::regclass) NOT NULL,
"mobile" varchar COLLATE "default",
"name" varchar(255) COLLATE "default",
"organization_id" int4,
CONSTRAINT "istar_user_pkey" PRIMARY KEY ("id")
)

CREATE TABLE "public"."pipeline_product" (
"pipeline_id" int4 NOT NULL,
"product_id" int4 NOT NULL,
CONSTRAINT "uq_pipeline_product_pipeline_id_product_id" UNIQUE ("pipeline_id", "product_id")
)
对于每个产品,可以有多个资产和管道

我想根据product.id对所有数据进行分组,这是我的初步尝试

SELECT
    product. ID AS pid,
    product. NAME AS pname,
    product.price,
    product.currency_id,
    product.description,
    product_asset.asset_type,
    product_asset.asset_url,
    product_asset.asset_name,
    product_asset.asset_value,
    product_asset. ID AS asset_id,
    String_agg (  pipeline_product.pipeline_id :: TEXT, ',' ) AS process_id
FROM
    product
LEFT JOIN product_asset ON product_asset.product_id = product. ID
AND product_asset.is_active = TRUE
LEFT JOIN pipeline_product ON pipeline_product.product_id = product. ID
WHERE
    organization_id IN (
        SELECT
            "user" .organization_id
        FROM
            "user"
        WHERE
            "user" . ID = 218915
    )
AND deleted = FALSE
GROUP BY
    pid,
    product_asset. ID,
    product_asset.asset_type,
    product_asset.asset_name,
    product_asset.asset_url,
product_asset.asset_value
我得到的输出是:

我只需要一个
product.id
条目,其他所有条目都应该在一列中,
我正在使用string_agg()函数。我遗漏了什么?

我在您的查询中发现了三个问题:

  • product\u asset.asset\u url
    不是唯一的,请使用
    max(product\u asset.asset\u url)
  • product\u asset.ID
    不是唯一的,因此无法对其进行分组。使用
    min(product\u asset.ID)
    max(product\u asset.ID)
  • String\u agg(pipeline\u product.pipeline\u id::TEXT,,”)
    不总是返回相同的值,因为它们没有排序,您应该添加
    ORDER BY pipeline\u product.product\u id,pipeline\u product.pipepepeline\u id

  • 如果每个
    product.id
    只需要一行,则应仅按该列分组。