POSTGRESQL 自连接创建具有特定条件的新列

问题描述 投票:0回答:2
CREATE TABLE accounts (
  "id" INTEGER,
  "parrent_account" INTEGER,
  "merchant_type" VARCHAR(8),
  "name" VARCHAR(32)
);

INSERT INTO accounts
  ("id", "parrent_account", "merchant_type", "name")
VALUES
  (1, 14056, 'outlet', 'RAA CHA SUKI & BBQ NIPAH MAL'),
  (2, 14056, 'outlet', 'RAA CHA SUKI & BBQ SUNTER MALL'),
  (3, 14056, 'outlet', 'RAA CHA SUKI & BBQ BAYWALK PLUIT'),
  (3499, NULL, 'MERCHANT', 'Kopi Kotak'),
  (3500, 3499, 'OUTLET', 'Kopi Kotak Tebet'),
  (14052, NULL, 'GROUP', 'Champ Group'),
  (14056, 14052, 'MERCHANT', 'RAA CHA');

如果 parrent_account 为空,则账户没有商户/群组。

如果商户类型是带有 parrent_account 的 Outlet,则 id(在 parrent_account 内)将引用商户。

如果商户类型是带有 parrent_account 的商户,则 id(在 parrent_account 内)将引用一个组。

预期结果:

id 家长帐户 商户类型 名字 商家 团体
1 14056 出口 RAA CHA SUKI & 烧烤尼帕马尔 RAA查 冠军集团
2 14056 出口 RAA CHA SUKI & BBQ SUNTER MALL RAA查 冠军集团
3 14056 出口 RAA CHA SUKI & BBQ BAYWALK PLUIT RAA查 冠军集团
3499 商家 科比科塔克
3500 3499 出口 Kopi Kotak Tebet 科比科塔克
14052 团体 冠军集团
14056 14052 商家 RAA查 冠军集团

查询 #1 和结果:

(第 6 行中的 CHAMP GROUP 应位于组字段中)

select v_outlet.*
, v_merchant.name as merchant
, v_group.name as group
from accounts v_outlet
left join accounts v_merchant on v_outlet.parrent_account = v_merchant.id
left join accounts v_group on v_merchant.parrent_account = v_group.id;
id 家长帐户 商户类型 名字 商家
3 14056 出口 RAA CHA SUKI & BBQ BAYWALK PLUIT RAA查 冠军集团
2 14056 出口 RAA CHA SUKI & BBQ SUNTER MALL RAA查 冠军集团
1 14056 出口 RAA CHA SUKI & 烧烤尼帕马尔 RAA查 冠军集团
3500 3499 出口 Kopi Kotak Tebet 科比科塔克
14052 团体 冠军集团
14056 14052 商家 RAA查 冠军集团
3499 商家 科比科塔克

在 DB Fiddle 上查看

查询 #2 和结果:

(第6行,RAA CHA有一个组,但结果为空)

select v_outlet.*
, v_merchant.name as merchant
, v_group.name as group
from accounts v_outlet
left join accounts v_merchant on v_outlet.merchant_type in ('outlet', 'OUTLET') and v_outlet.parrent_account = v_merchant.id
left join accounts v_group on v_merchant.merchant_type in ('merchant', 'MERCHANT') and v_merchant.parrent_account = v_group.id;
id 家长帐户 商户类型 名字 商家
3 14056 出口 RAA CHA SUKI & BBQ BAYWALK PLUIT RAA查 冠军集团
2 14056 出口 RAA CHA SUKI & BBQ SUNTER MALL RAA查 冠军集团
1 14056 出口 RAA CHA SUKI & 烧烤尼帕马尔 RAA查 冠军集团
3500 3499 出口 Kopi Kotak Tebet 科比科塔克
14052 团体 冠军集团
14056 14052 商家 RAA查
3499 商家 科比科塔克

在 DB Fiddle 上查看

postgresql join self-join
2个回答
1
投票

您需要额外加入

  1. 如果账户是直营店,请获取其商家
  2. 使用#1的商家,获得他们的团队
  3. 如果账户是商户,获取其所属群组
select v_outlet.*
, v_merchant.name as merchant
, coalesce(v_group.name, v_group2.name) as group
from accounts v_outlet
left join accounts v_merchant on v_outlet.merchant_type in ('outlet', 'OUTLET') and v_outlet.parrent_account = v_merchant.id
left join accounts v_group on v_merchant.merchant_type in ('merchant', 'MERCHANT') and v_merchant.parrent_account = v_group.id
left join accounts v_group2 on v_outlet.merchant_type in ('merchant', 'MERCHANT') and v_outlet.parrent_account = v_group2.id

数据库小提琴


0
投票

根据 DBFiddle 响应,您第一次尝试的结果是

这与您想要获得的结果不同,显示

null
而不是没有值的空字符串。您可以显式列出您的字段并使用
COALESCE(<yourfield>, '')
将这些空值转换为空字符串:

select  v_outlet.id
, v_outlet.parrent_account
, v_outlet.merchant_type
, COALESCE(v_outlet.name, '') AS name
, CASE WHEN v_group.name IS NOT NULL THEN COALESCE(v_merchant.name, '') ELSE '' END AS merchant
, CASE WHEN v_group.name IS NULL THEN COALESCE(v_merchant.name, '') ELSE '' END AS group
from accounts v_outlet
left join accounts v_merchant on v_outlet.parrent_account = v_merchant.id
left join accounts v_group on v_merchant.parrent_account = v_group.id
order by v_outlet.id

参见:https://www.db-fiddle.com/f/9BStxo95osxAd6cwwefNtS/2

© www.soinside.com 2019 - 2024. All rights reserved.