提问人:lemon chow 提问时间:8/7/2023 最后编辑:lemon chow 更新时间:8/7/2023 访问量:46
如何联接多个表以获得一个结果集,该结果集包括满足 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
问:
我有两个表 - 输入:
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 |
我想在以下条件下加入这个表
- 输入列名称应与 keywords_primary 模式匹配,并且keywords_secondary具有分隔符,后跟或前面是 ex: ssn_no(ssn 是主要的,no 是次要的)
- 输入列名称应与 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系列 |
答:
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
);
评论