使用多个JOINS进行选择,包括具有自己的JOIN的LISTAGG

问题描述

我有以下两个查询,分别运行时效果最佳。

查询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 = "&#xf00c;",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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...