You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何关联LeftTable与RightTable获取指定结果?SQL查询求助

解决你的SQL关联结果去重与匹配问题

看起来你遇到的问题是内连接产生了笛卡尔积,导致同level的记录重复关联,而你需要的是同level的左右表记录一一对应取最大值,并且只保留两边记录数较少的那部分结果。我来帮你解决这个问题:

问题回顾

先明确你的表数据和当前的问题:

LeftTable 数据

loginidpositionlevel
9972L1
9973L1
9974L2
9975L2
9976L2

RightTable 数据

loginidpositionlevel
9977R1
9978R1
9979R2

你当前的查询用内连接关联level,导致同level的每条左表记录都和每条右表记录匹配,产生了重复的结果。而你需要的是按level分组后,左右表记录一一对应取loginid的最大值,且只保留两边记录数较少的数量。

解决方案

我们可以用窗口函数ROW_NUMBER()给同level的记录编号,然后按编号和level关联,这样就能实现一一对应,避免笛卡尔积:

WITH LeftWithRow AS (
    SELECT loginid, level,
           -- 按level分组,给每条记录按loginid排序编号
           ROW_NUMBER() OVER (PARTITION BY level ORDER BY loginid) AS rn
    FROM LeftTable
),
RightWithRow AS (
    SELECT loginid, level,
           ROW_NUMBER() OVER (PARTITION BY level ORDER BY loginid) AS rn
    FROM RightTable
)
SELECT 
    -- 取两个loginid中的最大值
    CASE WHEN L.loginid > R.loginid THEN L.loginid ELSE R.loginid END AS LoginID,
    L.level
FROM LeftWithRow L
INNER JOIN RightWithRow R 
    -- 同时匹配level和编号rn,实现一一对应
    ON L.level = R.level 
    AND L.rn = R.rn;

代码解释

  1. CTE添加编号:用两个CTE分别给LeftTable和RightTable的同level记录按loginid排序并添加序号rn,这样每个level下的记录都有一个从1开始的唯一编号。
  2. 按编号关联:内连接时不仅匹配level,还匹配序号rn,这样同level同序号的左右表记录会一一关联,不会产生笛卡尔积。
  3. 取最大值:用CASE语句(或者数据库支持的GREATEST()函数)取两条关联记录中loginid的最大值。

如果你的数据库支持GREATEST()函数(比如SQL Server 2022及以上、MySQL、PostgreSQL等),可以把CASE语句简化,让代码更简洁:

WITH LeftWithRow AS (
    SELECT loginid, level,
           ROW_NUMBER() OVER (PARTITION BY level ORDER BY loginid) AS rn
    FROM LeftTable
),
RightWithRow AS (
    SELECT loginid, level,
           ROW_NUMBER() OVER (PARTITION BY level ORDER BY loginid) AS rn
    FROM RightTable
)
SELECT 
    GREATEST(L.loginid, R.loginid) AS LoginID,
    L.level
FROM LeftWithRow L
INNER JOIN RightWithRow R 
    ON L.level = R.level 
    AND L.rn = R.rn;

执行这个查询后,就能得到你期望的结果:

LoginIDlevel
99771
99781
99792

内容的提问来源于stack exchange,提问作者Naveen Kashyap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:07:30