使用外部应用来比较一个表中与另一表中的 1 列值匹配的 2 列

问题描述 投票:0回答:1

我是 SQL 中 APPLY 语句的新手,我正在尝试使用 APPLY 语句制定解决方案。

我有两张桌子:

身份证原件 目标ID
形状1 形状2
形状3 形状4
形状 颜色 边数 尺寸
形状1 橙色 3
形状2 红色 6
形状3 橙色 3
形状4 绿色 6

这些表描述了形状 ID 和“目标”形状。这里的目标是确定原始形状的特征是否与目标形状相同。查询将比较两列,如果它们具有相同的特征,则返回“TRUE”。

因此,在第二个表中,形状 1 是形状 3 的孪生,这意味着查询应为形状 1 和形状 3 返回“true”,但对于其他任何内容都不应返回“true”,因为不存在完美匹配。 (注意 2 和 4 的绿色/红色不同)

SELECT CASE WHEN
                 (SELECT COUNT(1) 
                 FROM table2 t2 (NOLOCK)
                 OUTER APPLY (SELECT t2.size, t2.color, t2.sides
                              WHERE t1.original_id = t2.shape
                              ) source
                 OUTER APPLY (SELECT t2.size, t2.color, t2.sides
                              WHERE t1.target_id = t2.shape
                              ) target
                WHERE (ISNULL(source.size, '') <> ISNULL(target.size, '')
                OR ISNULL(source.color, '') <> ISNULL(target.color, '')
                OR ISNULL(source.sides, '') <> ISNULL(target.sides, '')) > 0             
             THEN NULL ELSE 'TRUE'
END 

这是我尝试将其作为外部应用来执行此操作。我已经使用“EXISTS”和“COUNT”语句使查询工作,但我想测试我的知识并看看是否可以使用 APPLY。不幸的是,这个查询不会产生正确的结果。它似乎认为无论如何,形状之间总是存在差异。

sql case apply outer-apply
1个回答
0
投票

可以使用 apply 运算符,但我真诚地认为,当简单的连接就可以完成这项工作时,这是不值得的。请注意下面的结果我添加了一行:

INSERT INTO t1 (OriginalID, TargetID) VALUES
('SHAPE1', 'SHAPE2'),
('SHAPE3', 'SHAPE4'),
('SHAPE1', 'SHAPE3'); -- added

SELECT
      t1.OriginalID AS OriginalShape
    , t1.TargetID AS TargetShape
    , CASE WHEN t2.Color = t3.Color
            AND t2.NumSides = t3.NumSides
            AND t2.Size = t3.Size THEN 'TRUE' ELSE 'FALSE' 
      END AS SameCharacteristics
    , t2.Color t2color
    , t3.Color t3color
    , t2.NumSides t2NumSides
    , t3.NumSides t3NumSides
    , t2.Size t2Size
    , t3.Size t3Size
FROM t1
CROSS APPLY 
    (SELECT * FROM t2 WHERE t1.OriginalID = t2.Shape) t2
CROSS APPLY 
    (SELECT * FROM t2 WHERE t1.TargetID = t2.Shape) t3;
原始形状 目标形状 相同特征 t2颜色 t3 颜色 t2NumSides t3NumSides t2尺寸 t3尺寸
形状1 形状2 错误 橙色 红色 3 6
形状1 形状3 正确 橙色 橙色 3 3
形状3 形状4 错误 橙色 绿色 3 6
SELECT
      t1.OriginalID AS OriginalShape
    , t1.TargetID AS TargetShape
    , CASE WHEN t2.Color = t3.Color
            AND t2.NumSides = t3.NumSides
            AND t2.Size = t3.Size THEN 'TRUE' ELSE 'FALSE' 
      END AS SameCharacteristics
    , t2.Color t2color
    , t3.Color t3color
    , t2.NumSides t2NumSides
    , t3.NumSides t3NumSides
    , t2.Size t2Size
    , t3.Size t3Size
FROM t1
JOIN t2 t2 ON t1.OriginalID = t2.Shape
JOIN t2 t3 ON t1.TargetID = t3.Shape
原始形状 目标形状 相同特征 t2颜色 t3 颜色 t2NumSides t3NumSides t2尺寸 t3尺寸
形状1 形状2 错误 橙色 红色 3 6
形状1 形状3 正确 橙色 橙色 3 3
形状3 形状4 错误 橙色 绿色 3 6

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.