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

验证两列配对是否存在于另一表及SQL查询逻辑正确性

问题:验证多列配对存在性的SQL逻辑是否正确?

我曾查阅过多列比较的相关问题,但不确定是否契合当前需求。我需要验证表#t1中的courseid与courseNumber的精确配对是否存在于表#t2中,目标是通过位字段标记其存在状态。脚本最后部分返回1,但我不确定该逻辑是否能确保该精确配对存在于第二张表,请问这段SQL的比较逻辑是否正确?

示例数据及代码

CREATE TABLE #t1
 (
      courseid     VARCHAR(10)
     ,courseNumber VARCHAR(10)
 )

 INSERT INTO #t1(
    courseid
   , courseNumber
 )
 VALUES
    (3386341, 3387691)

 CREATE TABLE #t2
 (
     courseid       VARCHAR(10)
    ,courseNumber   VARCHAR(10)
    ,CourseArea     VARCHAR(10)
    ,CourseCert     VARCHAR(10)
    ,OtherCourseNum VARCHAR(10)
 )

 INSERT INTO #t2(
     courseid
   , courseNumber
   , CourseArea
   , CourseCert
   , OtherCourseNum
 )
 VALUES
    (3386341 , 3387691 , 9671 , 9671 , 233321)
   ,(3386341 , 3387691 , 9671 , 9671 , 233321)
   ,(3386342 , 3387692 , 9672 , 9672 , 233322)
   ,(3386342 , 3387692 , 9672 , 9672 , 233322)
   ,(3386343 , 3387693 , 9673 , 9673 , 233323)
   ,(3386343 , 3387693 , 9673 , 9673 , 233323)


SELECT 
   CASE WHEN courseid IN (SELECT courseid FROM #t1) AND courseNumber IN (SELECT courseNumber FROM #t2) THEN 1 ELSE 0 END AS IsCourse
FROM #t1

逻辑分析

你当前的SQL逻辑不正确,原因如下:

  • courseid IN (SELECT courseid FROM #t1)是拿当前#t1行的courseid和#t1自身的courseid做比较,这个条件永远为真,没有实际意义;
  • courseNumber IN (SELECT courseNumber FROM #t2)仅检查当前行的courseNumber是否在#t2的任意行中存在,没有和courseid做关联验证。也就是说,哪怕#t2里存在单独的某个courseid和某个courseNumber,但两者不属于同一行,这个条件也会返回真,无法确保同一行的courseid与courseNumber配对存在于#t2中。

正确写法

方法1:使用EXISTS子查询(推荐,性能最优)

SELECT 
    CASE 
        WHEN EXISTS (
            SELECT 1 
            FROM #t2 
            WHERE #t2.courseid = #t1.courseid 
              AND #t2.courseNumber = #t1.courseNumber
        ) THEN 1 
        ELSE 0 
    END AS IsCourse
FROM #t1

方法2:使用多列IN子查询

SELECT 
    CASE 
        WHEN (courseid, courseNumber) IN (
            SELECT courseid, courseNumber FROM #t2
        ) THEN 1 
        ELSE 0 
    END AS IsCourse
FROM #t1

方法3:使用LEFT JOIN结合分组

SELECT 
    CASE WHEN #t2.courseid IS NOT NULL THEN 1 ELSE 0 END AS IsCourse
FROM #t1
LEFT JOIN #t2 
    ON #t1.courseid = #t2.courseid 
    AND #t1.courseNumber = #t2.courseNumber
GROUP BY #t1.courseid, #t1.courseNumber

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:45:30