PostgreSQL-如何使用来自其他表的联接合并多行数据
我正在使用postgresql 9.6,希望将多行数据合并为一行。我使用了4个表(表格式和数据无法更改) 桌子是-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
"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
只需要一行,则应仅按该列分组。