SQL Server中如何筛选包含匹配id1和id2的groupid对应的uid记录
解决SQL Server中筛选关联成对ID的Group对应的UID问题
我来帮你搞定这个查询需求!先明确下我们的目标:从Table B里找出那些groupid同时关联了Table A中某一行的id1和id2的uid记录,最终返回符合条件的uid(也就是示例里的1、2、5、6)。
先确认表结构与测试数据
首先把你的测试数据用SQL语句还原出来,方便后续验证:
-- 创建并插入Table A数据 CREATE TABLE TableA ( id1 INT, id2 INT ); INSERT INTO TableA VALUES (2, 3), (4, 5); -- 创建并插入Table B数据 CREATE TABLE TableB ( groupid INT, parentid INT, uid INT ); INSERT INTO TableB VALUES (4, 2, 1), (4, 3, 2), (6, 2, 3), (7, 4, 4), (8, 4, 5), (8, 5, 6), (8, 6, 7);
方案一:使用CTE筛选合法Group后关联取UID
这种方法逻辑清晰,先找出所有符合条件的groupid,再关联回Table B获取对应的uid:
WITH ValidGroups AS ( -- 找出同时包含TableA某行id1和id2的groupid SELECT b.groupid, a.id1, a.id2 FROM TableB b JOIN TableA a ON b.parentid = a.id1 -- 检查同一groupid下是否存在对应id2的记录 WHERE EXISTS ( SELECT 1 FROM TableB b2 WHERE b2.groupid = b.groupid AND b2.parentid = a.id2 ) ) -- 从合法group中取出对应id1/id2的uid SELECT b.uid FROM TableB b JOIN ValidGroups vg ON b.groupid = vg.groupid WHERE b.parentid IN (vg.id1, vg.id2);
方案二:使用分组统计直接筛选
这种方法通过分组统计每个groupid对TableA行的匹配数量,确保同时包含id1和id2:
SELECT b.uid FROM TableB b INNER JOIN TableA a ON b.parentid = a.id1 OR b.parentid = a.id2 GROUP BY b.groupid, a.id1, a.id2, b.uid -- 确保当前groupid对当前TableA行,同时匹配了id1和id2(两个不同的parentid) HAVING COUNT(DISTINCT b.parentid) = 2;
结果验证
执行以上任意一种SQL,都会得到预期的结果:
uid ---- 1 2 5 6
内容的提问来源于stack exchange,提问作者Anonymous Creator
相关产品推荐
相关产品推荐

