基于多列Where Condition的查询需求:取记录数最多的数据集
解决思路:按A分组计数后选择记录数更多的数据集
嘿,我来帮你搞定这个需求!先把你的示例数据整理得更清楚,然后一步步给你讲怎么实现。
你的示例数据
Table1
| A | col2 | col3 |
|---|---|---|
| 123 | xxxx | xxyy |
| 234 | ysx | ddd |
Table2
| A | B | col3 | col4 |
|---|---|---|---|
| 123 | 321 | xx | yy |
| 123 | 567 | fdfdh | fjfj |
| 456 | 123 | dhfdh | dsgds |
需求核心很明确:对每个A值,对比Table1里该A的总记录数,和Table2里该A的总记录数(不管B列怎么分组,我们只看每个A下的总行数),然后选记录数更多的那个表中对应A的所有行。如果两边记录数一样,你可以自己选优先用哪个表的数据,我下面默认选Table2
用SQL实现的步骤
我用CTE(公共表表达式)来简化逻辑,这样可读性更强:
完整代码
-- 第一步:先统计每个A在两个表中的记录数 WITH t1_counts AS ( SELECT A, COUNT(*) AS record_count FROM Table1 GROUP BY A ), t2_counts AS ( SELECT A, COUNT(*) AS record_count FROM Table2 GROUP BY A ) -- 第二步:选Table2中记录数更多的A对应的所有行 SELECT t2.* FROM Table2 t2 JOIN t2_counts tc2 ON t2.A = tc2.A LEFT JOIN t1_counts tc1 ON t2.A = tc1.A WHERE tc2.record_count > COALESCE(tc1.record_count, 0) -- 第三步:合并Table1中记录数更多的A对应的所有行 UNION ALL SELECT t1.* FROM Table1 t1 JOIN t1_counts tc1 ON t1.A = tc1.A LEFT JOIN t2_counts tc2 ON t1.A = tc2.A WHERE tc1.record_count > COALESCE(tc2.record_count, 0) -- 第四步:处理两边记录数相等的情况(这里选Table2的行,要改的话换t1就行) UNION ALL SELECT t2.* FROM Table2 t2 JOIN t2_counts tc2 ON t2.A = tc2.A JOIN t1_counts tc1 ON t2.A = tc1.A WHERE tc1.record_count = tc2.record_count;
代码细节解释
COALESCE(tc1.record_count, 0):专门处理某个A只在一个表存在的情况,比如示例里的456只在Table2,234只在Table1,这时候另一个表的计数就按0算,保证逻辑能正常判断- 三个
SELECT分支分别对应三种场景:Table2记录数多、Table1记录数多、两者相等,你可以根据实际需求调整相等时的选择逻辑 - 如果需要输出的列结构完全一致(比如Table1没有B和col4列,要补null),可以把Table1的SELECT部分改成:
SELECT t1.A, NULL AS B, t1.col3, NULL AS col4 FROM Table1 t1 ...
运行示例后的结果
用你的测试数据跑这个SQL,会得到:
A=123:Table2有2条,比Table1的1条多,所以取Table2的2行A=234:只有Table1有,取Table1的1行A=456:只有Table2有,取Table2的1行
结果表大概是这样(如果补全了null的话):
| A | B | col3 | col4 |
|---|---|---|---|
| 123 | 321 | xx | yy |
| 123 | 567 | fdfdh | fjfj |
| 234 | NULL | ddd | NULL |
| 456 | 123 | dhfdh | dsgds |
这样就完全符合你的需求啦!
内容的提问来源于stack exchange,提问作者M S
相关产品推荐
相关产品推荐

