如何联接多个表以获得一个结果集,该结果集包括满足 group by 和 having 子句的行以及满足一个条件的行

How do I join multiple tables to get a result set that includes rows that fulfil group by and having clause as well as rows that satisfy one criterion

提问人:lemon chow 提问时间:8/7/2023 最后编辑:lemon chow 更新时间:8/7/2023 访问量:46

问:

我有两个表 - 输入:

Input_table

ait_no schema_nm column_nm table_nm
1 AIC公司 SSN系列 sic_tabl
2 AIC公司 ssn_1 bhue_tab
1 艾特 ssn_no eyfu_tab
1 艾特 ssn_number gic_tab
2 AIC公司 is_snn_no yfjs_tab
2 AIC公司 is_snn_number yfjs_tab

Xref_table:

keywords_primary keywords_secondary entity_category excld_sw
SSN系列 SNN公司 0
SSN系列 SSN系列 0
SSN系列 SSN系列 1

我想在以下条件下加入这个表

  1. 输入列名称应与 keywords_primary 模式匹配,并且keywords_secondary具有分隔符,后跟或前面是 ex: ssn_no(ssn 是主要的,no 是次要的)
  2. 输入列名称应与 keywords_primary 模式匹配,如果输入列中的 keywords_primary 替换为“”,则不应包含任何其他字母。

我有这个查询:

SELECT input.ait_no,
       input.schema_nm,
       input.table_nm,
       input.column_nm,
       xref.entity_category
FROM   input_table input
       INNER JOIN xref_table xref
               ON ( ( ( input.column_nm LIKE
                        '%[^a-zA-Z]' + xref.keywords_primary
                        + '[^a-zA-Z]%' )
                       OR ( input.column_nm LIKE xref.keywords_primary +
                                                 '[^a-zA-Z]%' )
                    )
                    AND ( ( input.column_nm LIKE
                            '%[^a-zA-Z]' + xref.keywords_secondary
                            + '[^a-zA-Z]%' )
                           OR ( input.column_nm LIKE xref.keywords_secondary +
                                                     '[^a-zA-Z]%' )
                           OR ( input.column_nm LIKE
                                '%[^a-zA-Z]' + xref.keywords_secondary ) ) )
                   OR ( REPLACE(input.column_nm, xref.keywords_primary, '') NOT
                        LIKE
                        '%[a-zA-Z]%' )
GROUP  BY input.ait_no,
          input.schema_nm,
          input.table_nm,
          input.column_nm,
          xref.entity_category
HAVING NOT Max(xref.excld_sw) = 1 

这里,由于此连接条件( REPLACE(input.column_nm,xref.keywords_primary,'') 不像 '%[a-zA-Z]%') 而未返回所有结果,因为我只使用 primary_keyword 并且分配给它excld_sw keywords_secondary,因此它们被消除了 例如: ( ssn_1匹配但未返回,因为主_keyword, 辅助关键字“ssn”和“is”设置为 1)。

在这里,我如何获得满足 group by 和 having 子句的结果集,以及满足 ( REPLACE(input.column_nm,xref.keywords_primary,'') 不像 '%[a-zA-Z]%') 条件的行,同时加入,即使 group by 和 having 没有满足。

Output_table

ait_no schema_nm column_nm table_nm entity_category
1 AIC公司 SSN系列 sic_tabl SSN系列
2 AIC公司 ssn_1 bhue_tab SSN系列
1 艾特 ssn_no eyfu_tab SSN系列
1 艾特 ssn_number gic_tab SSN系列
sql sql-服务器 分组依据 内部连接 拥有

评论


答:

1赞 Ponmani Chinnaswamy 8/7/2023 #1

创建一个临时表并试用

CREATE TEMPORARY TABLE temp_join_results AS
SELECT input.ait_no,
       input.schema_nm,
       input.table_nm,
       input.column_nm,
       xref.entity_category
FROM   input_table input
       INNER JOIN xref_table xref
               ON ( ( ( input.column_nm LIKE
                        '%[^a-zA-Z]' + xref.keywords_primary
                        + '[^a-zA-Z]%' )
                       OR ( input.column_nm LIKE xref.keywords_primary +
                                                 '[^a-zA-Z]%' )
                    )
                    AND ( ( input.column_nm LIKE
                            '%[^a-zA-Z]' + xref.keywords_secondary
                            + '[^a-zA-Z]%' )
                           OR ( input.column_nm LIKE xref.keywords_secondary +
                                                     '[^a-zA-Z]%' )
                           OR ( input.column_nm LIKE
                                '%[^a-zA-Z]' + xref.keywords_secondary ) ) )
                   OR ( REPLACE(input.column_nm, xref.keywords_primary, '') NOT
                        LIKE
                        '%[a-zA-Z]%' ));

-- Select results from the temporary table that fulfill the HAVING clause
SELECT tjr.ait_no,
       tjr.schema_nm,
       tjr.table_nm,
       tjr.column_nm,
       tjr.entity_category
FROM temp_join_results tjr
WHERE tjr.ait_no IN (
    SELECT tjr_inner.ait_no
    FROM temp_join_results tjr_inner
    GROUP BY tjr_inner.ait_no
    HAVING NOT MAX(tjr_inner.excld_sw) = 1
);