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

问题描述 投票:0回答:1

我有两个表 - 输入:

输入表

ait_不 schema_nm 列_nm 表_nm
1 艾克 ssn 原文如此
2 艾克 ssn_1 bhue_tab
1 艾滋 ssn_no eyfu_tab
1 艾滋 ssn_号码 gic_选项卡
2 艾克 is_snn_no yfjs_选项卡
2 艾克 is_snn_number yfjs_选项卡

外部参照表:

keywords_primary 关键词_次要 实体_类别 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 并且有许多 keywords_secondary 被分配给它,并且 excld_sw 设置为 1,因此它们被消除,例如:( ssn_1 匹配但未返回,因为主 _keyword、辅助关键字 'ssn' 和 'is' 设置为 1)。

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

输出表

ait_不 schema_nm 列_nm 表_nm 实体_类别
1 艾克 ssn 原文如此 ssn
2 艾克 ssn_1 bhue_tab ssn
1 艾滋 ssn_no eyfu_tab ssn
1 艾滋 ssn_号码 gic_选项卡 ssn
sql sql-server group-by inner-join having
1个回答
0
投票

创建一个临时表并尝试一下

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
);
© www.soinside.com 2019 - 2024. All rights reserved.