我是 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。不幸的是,这个查询不会产生正确的结果。它似乎认为无论如何,形状之间总是存在差异。
可以使用 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 | 大 | 小 |