我不知道我是否理解你需要什么。 但是,这是一个可能的部分解决方案。 您可以根据您的要求改善这一点。
在postgre中的示例。
CREATE TEMPORARY TABLE items (
item varchar(10),
branch varchar(10),
type varchar(10)
);
INSERT INTO items VALUES ('A', 'Main', 'Box');
INSERT INTO items VALUES ('A', 'London', 'Single');
INSERT INTO items VALUES ('A', 'Paris', 'Single');
INSERT INTO items VALUES ('A', 'Tokyo', 'Box');
INSERT INTO items VALUES ('B', 'Main', 'Single');
INSERT INTO items VALUES ('B', 'London', 'Single');
INSERT INTO items VALUES ('B', 'Paris', 'Single');
INSERT INTO items VALUES ('C', 'Main', 'Single');
INSERT INTO items VALUES ('C', 'London', 'Box');
INSERT INTO items VALUES ('C', 'Paris', 'Single');
INSERT INTO items VALUES ('C', 'Tokyo', 'Single');
INSERT INTO items VALUES ('D', 'Main', 'Box');
INSERT INTO items VALUES ('D', 'London', 'Single');
INSERT INTO items VALUES ('D', 'Paris', 'Box');
INSERT INTO items VALUES ('D', 'Tokyo', 'Box');
INSERT INTO items VALUES ('D', 'Sydney', 'Single');
SELECT
CASE WHEN T.branch = 'Main' THEN rpad(T.item, length(T.item) + T.children::INT, '*') ELSE T.item END item,
T.branch,
T.type
FROM (
SELECT
I.item,
I.branch,
I.type,
MAIN_ITEMS.item mitem,
MAIN_ITEMS.branch mbranch,
MAIN_ITEMS.type mtype,
(SELECT count(j.item)
FROM items j
WHERE I.ITEM = j.item AND I.type <> j.type) children FROM items I
JOIN (
SELECT
item,
branch,
type
FROM items
WHERE branch = 'Main'
) MAIN_ITEMS
ON ((I.ITEM = MAIN_ITEMS.item AND I.type <> MAIN_ITEMS.type) OR (
I.ITEM = MAIN_ITEMS.item AND I.branch = MAIN_ITEMS.branch AND I.type = MAIN_ITEMS.type
)
)
) T
where T.children > 0;
输出:
A** Main Box
A London Single
A Paris Single
C* Main Single
C London Box
D** Main Box
D London Single
D Sydney Single
我希望这样帮助你。
*“我尝试过加入和各种各样的......”*有很多有帮助的人,所以除非你显示你尝试过的东西,否则他们不会去回答。如果在问题中包含CREATE TABLE和INSERT语句,您也可能获得更多的回复。 –
我不确定我的理解。为什么结果中不包含项目B的任何记录? –
@ destination-data Hi来自B的任何记录都不在结果中,因为'B的所有其他分支中的主分支的类型相同,而其他分支中的其他项目的类型不同。希望这可以解释它 – Sinnerv