避免重复来自 2 个左连接表的聚合列值
Avoid repetition of aggregated column values from 2 left joined tables
我有 5 个 table 包含如下行:
RESEARCH_REPORTS table:
REPORT_ID TOPIC
141 My Report Topic Title
142 Another Report Topic Title
143 Yet Another Report Topic Title
...
PROGRAM_AREAS_REPORTS_REL table:
REPORT_ID PROGRAM_AREA_ID
141 6
141 11
141 12
...
PROGRAM_AREAS table:
PROGRAM_AREA_ID TITLE
6 Program Area One
11 Program Area Two
12 Program Area Three
...
RESEARCH_REPORT_CATEGORY_REL table:
REPORT_ID CATEGORY_ID
141 9
141 10
141 18
141 23
...
RESEARCH_REPORT_CATEGORIES table:
CATEGORY_ID NAME
9 Category One
10 Category Two
18 Category Three
23 Category Four
...
此查询目前正在向我返回以下结果:
SELECT rr.report_id,
rr.topic,
string_agg(pa.title, '|') as program_areas,
string_agg(rrc.name, '|') as categories
FROM RESEARCH_REPORTS rr
LEFT JOIN PROGRAM_AREAS_REPORTS_REL parr ON rr.report_id = parr.report_id
LEFT JOIN RESEARCH_REPORT_CATEGORY_REL rrcr ON rr.report_id = rrcr.report_id
LEFT JOIN PROGRAM_AREAS pa ON parr.program_area_id = pa.program_area_id
LEFT JOIN RESEARCH_REPORT_CATEGORIES rrc ON rrcr.category_id = rrc.category_id
WHERE rr.report_id = 141
GROUP BY rr.report_id, rr.topic
查询结果:
|---------------------|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| report_id | topic | program_areas | categories |
|---------------------|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 141 | My Report Topic Title | Program Area One|Program Area Two|Program Area Three|Program Area One|Program Area Two|Program Area Three|Program Area One|Program Area Two|Program Area Three | Category One|Category Two|Category Three|Category Four|Category One|Category Two|Category Three|Category Four|Category One|Category Two|Category Three|Category Four|Category One|Category Two|Category Three|Category Four |
|---------------------|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
如果注意到,结果列 program_areas
和 categories
中的聚合值会重复。我需要使用 select 查询来避免这些重复项,结果格式如下:
首选查询结果:
|---------------------|-------------------------------------|---------------------------------------------------------|--------------------------------------------------------------|
| report_id | topic | program_areas | categories |
|---------------------|-------------------------------------|---------------------------------------------------------|--------------------------------------------------------------|
| 141 | My Report Topic Title | Program Area One|Program Area Two|Program Area Three | Category One|Category Two|Category Three|Category Four |
|---------------------|-------------------------------------|---------------------------------------------------------|--------------------------------------------------------------|
如何在我当前的查询中完成此操作?
试试这个查询
SELECT rr.report_id, rr.topic,
STUFF((SELECT ' | '+ PROGRAM_AREAS.title FROM PROGRAM_AREAS FOR XML PATH('')),1,2,'') AS program_areas,
STUFF((SELECT ' | '+ RESEARCH_REPORT_CATEGORIES.NAME FROM RESEARCH_REPORT_CATEGORIES FOR XML PATH('')),1,2,'') AS categories
FROM RESEARCH_REPORTS rr
LEFT JOIN PROGRAM_AREAS_REPORTS_REL parr ON rr.report_id = parr.REPORT_ID
LEFT JOIN RESEARCH_REPORT_CATEGORY_REL rrcr ON rr.report_id = rrcr.report_id
WHERE rr.report_id = 141
GROUP BY rr.report_id, rr.topic
你可以试试这个
SELECT rr.report_id
, rr.topic
, ( SELECT string_agg(pa.title, '|')
FROM PROGRAM_AREAS pa
JOIN PROGRAM_AREAS_REPORTS_REL parr
ON parr.program_area_id = pa.program_area_id
WHERE parr.report_id = rr.report_id
GROUP BY parr.report_id ) as program_areas
, ( SELECT string_agg(rrc.name, '|')
FROM RESEARCH_REPORT_CATEGORIES rrc
JOIN RESEARCH_REPORT_CATEGORY_REL rrcr
ON rrcr.category_id = rrc.category_id
WHERE rrcr.report_id = rr.report_id
GROUP BY rrcr.report_id ) as categories
FROM RESEARCH_REPORTS rr
WHERE rr.report_id = 141
我不确定如何设置由 STRING_AGG 连接的 names/titles 的顺序。
我有 5 个 table 包含如下行:
RESEARCH_REPORTS table:
REPORT_ID TOPIC
141 My Report Topic Title
142 Another Report Topic Title
143 Yet Another Report Topic Title
...
PROGRAM_AREAS_REPORTS_REL table:
REPORT_ID PROGRAM_AREA_ID
141 6
141 11
141 12
...
PROGRAM_AREAS table:
PROGRAM_AREA_ID TITLE
6 Program Area One
11 Program Area Two
12 Program Area Three
...
RESEARCH_REPORT_CATEGORY_REL table:
REPORT_ID CATEGORY_ID
141 9
141 10
141 18
141 23
...
RESEARCH_REPORT_CATEGORIES table:
CATEGORY_ID NAME
9 Category One
10 Category Two
18 Category Three
23 Category Four
...
此查询目前正在向我返回以下结果:
SELECT rr.report_id,
rr.topic,
string_agg(pa.title, '|') as program_areas,
string_agg(rrc.name, '|') as categories
FROM RESEARCH_REPORTS rr
LEFT JOIN PROGRAM_AREAS_REPORTS_REL parr ON rr.report_id = parr.report_id
LEFT JOIN RESEARCH_REPORT_CATEGORY_REL rrcr ON rr.report_id = rrcr.report_id
LEFT JOIN PROGRAM_AREAS pa ON parr.program_area_id = pa.program_area_id
LEFT JOIN RESEARCH_REPORT_CATEGORIES rrc ON rrcr.category_id = rrc.category_id
WHERE rr.report_id = 141
GROUP BY rr.report_id, rr.topic
查询结果:
|---------------------|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| report_id | topic | program_areas | categories |
|---------------------|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 141 | My Report Topic Title | Program Area One|Program Area Two|Program Area Three|Program Area One|Program Area Two|Program Area Three|Program Area One|Program Area Two|Program Area Three | Category One|Category Two|Category Three|Category Four|Category One|Category Two|Category Three|Category Four|Category One|Category Two|Category Three|Category Four|Category One|Category Two|Category Three|Category Four |
|---------------------|-------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
如果注意到,结果列 program_areas
和 categories
中的聚合值会重复。我需要使用 select 查询来避免这些重复项,结果格式如下:
首选查询结果:
|---------------------|-------------------------------------|---------------------------------------------------------|--------------------------------------------------------------|
| report_id | topic | program_areas | categories |
|---------------------|-------------------------------------|---------------------------------------------------------|--------------------------------------------------------------|
| 141 | My Report Topic Title | Program Area One|Program Area Two|Program Area Three | Category One|Category Two|Category Three|Category Four |
|---------------------|-------------------------------------|---------------------------------------------------------|--------------------------------------------------------------|
如何在我当前的查询中完成此操作?
试试这个查询
SELECT rr.report_id, rr.topic,
STUFF((SELECT ' | '+ PROGRAM_AREAS.title FROM PROGRAM_AREAS FOR XML PATH('')),1,2,'') AS program_areas,
STUFF((SELECT ' | '+ RESEARCH_REPORT_CATEGORIES.NAME FROM RESEARCH_REPORT_CATEGORIES FOR XML PATH('')),1,2,'') AS categories
FROM RESEARCH_REPORTS rr
LEFT JOIN PROGRAM_AREAS_REPORTS_REL parr ON rr.report_id = parr.REPORT_ID
LEFT JOIN RESEARCH_REPORT_CATEGORY_REL rrcr ON rr.report_id = rrcr.report_id
WHERE rr.report_id = 141
GROUP BY rr.report_id, rr.topic
你可以试试这个
SELECT rr.report_id
, rr.topic
, ( SELECT string_agg(pa.title, '|')
FROM PROGRAM_AREAS pa
JOIN PROGRAM_AREAS_REPORTS_REL parr
ON parr.program_area_id = pa.program_area_id
WHERE parr.report_id = rr.report_id
GROUP BY parr.report_id ) as program_areas
, ( SELECT string_agg(rrc.name, '|')
FROM RESEARCH_REPORT_CATEGORIES rrc
JOIN RESEARCH_REPORT_CATEGORY_REL rrcr
ON rrcr.category_id = rrc.category_id
WHERE rrcr.report_id = rr.report_id
GROUP BY rrcr.report_id ) as categories
FROM RESEARCH_REPORTS rr
WHERE rr.report_id = 141
我不确定如何设置由 STRING_AGG 连接的 names/titles 的顺序。