如何用SQL的OUTER APPLY对比原形状与目标形状的特征一致性?
使用APPLY语句对比形状特征一致性
需求说明
有两张表:
表1(形状映射表)
| Original ID | Target ID |
|---|---|
| SHAPE1 | SHAPE2 |
| SHAPE3 | SHAPE4 |
表2(形状特征表)
| Shape | Color | Num Sides | Size |
|---|---|---|---|
| SHAPE1 | Orange | 3 | Large |
| SHAPE2 | Red | 6 | Small |
| SHAPE3 | Orange | 3 | Large |
| SHAPE4 | Green | 6 | Small |
需要判断表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为基础,遍历每一组原形状与目标形状的映射关系
- 第一个
OUTER APPLY获取当前Original ID对应的所有特征,命名为source - 第二个
OUTER APPLY获取当前Target ID对应的所有特征,命名为target - 在
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
相关产品推荐
相关产品推荐

