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

如何用SQL的OUTER APPLY对比原形状与目标形状的特征一致性?

使用APPLY语句对比形状特征一致性

需求说明

有两张表:

表1(形状映射表)

Original IDTarget ID
SHAPE1SHAPE2
SHAPE3SHAPE4

表2(形状特征表)

ShapeColorNum SidesSize
SHAPE1Orange3Large
SHAPE2Red6Small
SHAPE3Orange3Large
SHAPE4Green6Small

需要判断表1中每一组Original ID和Target ID对应的形状特征是否完全一致,一致则返回'TRUE',否则返回NULL。

原查询问题

你写的查询逻辑存在核心错误:

  • 错误将table2作为主表,导致无法按表1的映射关系逐一匹配原形状和目标形状
  • APPLY子查询的筛选逻辑混乱,没有正确关联表1的对应ID,无法精准获取每组形状的特征

正确的APPLY实现方式

我们可以以表1为主表,通过两次OUTER APPLY分别获取每组原形状和目标形状的特征,再直接对比字段:

SELECT 
    t1.[Original ID],
    t1.[Target ID],
    CASE 
        WHEN source.Color = target.Color 
             AND source.[Num Sides] = target.[Num Sides] 
             AND source.Size = target.Size 
        THEN 'TRUE' 
        ELSE NULL 
    END AS Is_Feature_Match
FROM 
    表1 t1
OUTER APPLY (
    SELECT Color, [Num Sides], Size 
    FROM 表2 
    WHERE Shape = t1.[Original ID]
) source
OUTER APPLY (
    SELECT Color, [Num Sides], Size 
    FROM 表2 
    WHERE Shape = t1.[Target ID]
) target

逻辑说明

  1. 以表1为基础,遍历每一组原形状与目标形状的映射关系
  2. 第一个OUTER APPLY获取当前Original ID对应的所有特征,命名为source
  3. 第二个OUTER APPLY获取当前Target ID对应的所有特征,命名为target
  4. 在CASE语句中直接对比两个结果集的特征字段,全部一致则返回'TRUE',否则返回NULL

如果需要处理特征字段为NULL的场景,可以用ISNULL做兼容处理:

SELECT 
    t1.[Original ID],
    t1.[Target ID],
    CASE 
        WHEN ISNULL(source.Color, '') = ISNULL(target.Color, '')
             AND ISNULL(source.[Num Sides], 0) = ISNULL(target.[Num Sides], 0)
             AND ISNULL(source.Size, '') = ISNULL(target.Size, '')
        THEN 'TRUE' 
        ELSE NULL 
    END AS Is_Feature_Match
FROM 
    表1 t1
OUTER APPLY (
    SELECT Color, [Num Sides], Size 
    FROM 表2 
    WHERE Shape = t1.[Original ID]
) source
OUTER APPLY (
    SELECT Color, [Num Sides], Size 
    FROM 表2 
    WHERE Shape = t1.[Target ID]
) target

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:00:56