问题描述
查询1
SELECT eps.PROPOSAL_NUMBER,eps.TITLE,per.FULL_NAME,ext.NRP_IREF_CD,ext.RESEARCH_TYPE_CD,nsf.NSF_CODE,ext.NPS_THRUST_DESCRIPTION,CASE
WHEN OPTION_1 = 'Y' THEN 'Option 1'
WHEN OPTION_2 = 'Y' THEN 'Option 2'
WHEN OPTION_3 = 'Y' THEN 'Option 3'
WHEN OPTION_4 = 'Y' THEN 'Option 4'
WHEN OPTION_5 = 'Y' THEN 'Option 5'
WHEN OPTION_6 = 'Y' THEN 'Option 6'
WHEN OPTION_7 = 'Y' THEN 'Option 7'
WHEN OPTION_8 = 'Y' THEN 'Option 8'
WHEN OPTION_9 = 'Y' THEN 'Option 9'
WHEN OPTION_0 = 'Y' THEN 'Not Applicable'
ELSE ''
END ONR,abs.ABSTRACT_DETAILS
FROM EPS_PROPOSAL eps
LEFT JOIN EPS_PROPOSAL_EXT_T ext
ON eps.PROPOSAL_NUMBER = ext.PROPOSAL_NUMBER
LEFT JOIN EPS_PROP_PERSON per
ON eps.PROPOSAL_NUMBER = per.PROPOSAL_NUMBER AND
(per.PROP_PERSON_ROLE_ID = 'PI' OR per.PROP_PERSON_ROLE_ID = 'PD')
LEFT JOIN EPS_PROP_ABSTRACT abs
ON eps.PROPOSAL_NUMBER = abs.PROPOSAL_NUMBER
LEFT JOIN NSF_CODES nsf
ON eps.NSF_CODE = nsf.NSF_SEQUENCE_NUMBER
WHERE eps.OWNED_BY_UNIT = '401' AND eps.requested_start_date_initial >= DATE '2019-10-01';
结果
--------
PROPOSAL_NUMBER TITLE FULL_NAME NRP_IREF_CD ... <br />
2028 blah ... .... <br />
2029 blah2 ... .... <br />
2030 blah3 ... .... <br />
查询2
SELECT eps.PROPOSAL_NUMBER,LISTAGG(sk.DESCRIPTION,',') WITHIN GROUP (ORDER BY sk.DESCRIPTION) AS KEYWORDS
FROM EPS_PROPOSAL eps
LEFT JOIN EPS_PROP_SCIENCE_KEYWORD key
ON eps.PROPOSAL_NUMBER = key.PROPOSAL_NUMBER
LEFT JOIN SCIENCE_KEYWORD sk
ON key.SCIENCE_KEYWORD_CODE = sk.SCIENCE_KEYWORD_CODE
GROUP BY eps.PROPOSAL_NUMBER;
结果
--------
PROPOSAL_NUMBER KEYWORDS
2028 Keyword_A,Keyword_B,Keyword_C,Keyword_D
2029 Keyword_Y,Keyword_Z
2030 Keyword_W
因此您可以看到我正在处理的主表是EPS_PROPOSAL
,那里的PK是PROPOSAL_NUMBER
。
还有其他利用该PK作为FK的表,例如EPS_PROP_SCIENCE_KEYWORD
,其中您可以有多行关键字映射到相同的PROPOSAL_NUMBER。问题在于该表上仅存储ID或代码,因此需要与SCIENCE_KEYWORD
表进行联接以获得描述。
问题: 如何合并这两个查询,以便我的结果看起来像这样:
Results
--------
PROPOSAL_NUMBER TITLE FULL_NAME NRP_IREF_CD ... KEYWORDS
2028 blah ... .... Keyword_A,Keyword_D
2029 blah2 ... .... Keyword_Y,Keyword_Z
2030 blah3 ... .... Keyword_W
解决方法
最简单的方法是进行小的修改-使用子查询添加OUTER APPLY:
protected override async void OnAppearing()
{
Label newLabel = new Label()
{
Text = "",FontFamily = "Font Awesome 5 Free-Solid-900.otf#Font Awesome 5 Free-Solid-900",FontSize = 40
};
contentPage.Content = newLabel;
}
,
一种选择是使用通用表表达式:
WITH Q1 AS
(
SELECT eps.PROPOSAL_NUMBER,eps.TITLE,per.FULL_NAME,ext.NRP_IREF_CD,ext.RESEARCH_TYPE_CD,nsf.NSF_CODE,ext.NPS_THRUST_DESCRIPTION,CASE
WHEN OPTION_1 = 'Y' THEN 'Option 1'
WHEN OPTION_2 = 'Y' THEN 'Option 2'
WHEN OPTION_3 = 'Y' THEN 'Option 3'
WHEN OPTION_4 = 'Y' THEN 'Option 4'
WHEN OPTION_5 = 'Y' THEN 'Option 5'
WHEN OPTION_6 = 'Y' THEN 'Option 6'
WHEN OPTION_7 = 'Y' THEN 'Option 7'
WHEN OPTION_8 = 'Y' THEN 'Option 8'
WHEN OPTION_9 = 'Y' THEN 'Option 9'
WHEN OPTION_0 = 'Y' THEN 'Not Applicable'
ELSE ''
END ONR,abs.ABSTRACT_DETAILS
FROM EPS_PROPOSAL eps
LEFT JOIN EPS_PROPOSAL_EXT_T ext
ON eps.PROPOSAL_NUMBER = ext.PROPOSAL_NUMBER
LEFT JOIN EPS_PROP_PERSON per
ON eps.PROPOSAL_NUMBER = per.PROPOSAL_NUMBER AND
(per.PROP_PERSON_ROLE_ID = 'PI' OR per.PROP_PERSON_ROLE_ID = 'PD')
LEFT JOIN EPS_PROP_ABSTRACT abs
ON eps.PROPOSAL_NUMBER = abs.PROPOSAL_NUMBER
LEFT JOIN NSF_CODES nsf
ON eps.NSF_CODE = nsf.NSF_SEQUENCE_NUMBER
WHERE eps.OWNED_BY_UNIT = '401' AND eps.requested_start_date_initial >= DATE'2019-10-01'
),Q2 AS
(
SELECT eps.PROPOSAL_NUMBER,LISTAGG(sk.DESCRIPTION,',') WITHIN GROUP(ORDER BY sk.DESCRIPTION) AS KEYWORDS
FROM EPS_PROPOSAL eps
LEFT JOIN EPS_PROP_SCIENCE_KEYWORD key
ON eps.PROPOSAL_NUMBER = key.PROPOSAL_NUMBER
LEFT JOIN SCIENCE_KEYWORD sk
ON key.SCIENCE_KEYWORD_CODE = sk.SCIENCE_KEYWORD_CODE
GROUP BY eps.PROPOSAL_NUMBER
)
SELECT Q1.*,Q2.KEYWORDS
FROM Q1
JOIN Q2
ON Q2.PROPOSAL_NUMBER = Q1.PROPOSAL_NUMBER