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 | 商家 | 科比科塔克 |
查询 #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 | 商家 | 科比科塔克 |
您需要额外加入
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
根据 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