sql - 为什么引用不属于正在查询的表的列(作为左侧操作数)不是 EXISTS 运算符中的错误?
问题描述
鉴于此 SQL 批处理:
CREATE TABLE #source
(
ID int,
SourceDescr varchar(255)
)
INSERT INTO #source
VALUES
(1, 'first'),
(2, 'second')
CREATE TABLE #target
(
ID int,
TargetDescr varchar(255)
)
INSERT INTO #target
SELECT * FROM #source
INSERT INTO #target
SELECT * FROM #source S
WHERE NOT EXISTS
(
SELECT 1
FROM #target
WHERE SourceDescr = S.SourceDescr
-- /\ How is this not an error?
)
为什么运算符中的WHERE
子句EXISTS
起作用?表中肯定没有SourceDescr
列#target
。
我什至试过这个,它也有效:
INSERT INTO #target
SELECT * FROM #source S
WHERE NOT EXISTS
(
SELECT SourceDescr -- ??
FROM #target
WHERE SourceDescr = S.SourceDescr
)
阅读EXISTS的官方文档并没有为我澄清这一点。
谢谢。
解决方案
这被解释为:
INSERT INTO #target
SELECT S.*
FROM #source S
WHERE NOT EXISTS
(
SELECT 1
FROM #target
WHERE S.SourceDescr = S.SourceDescr
);
它运行,但它并没有按照您的意图进行。
这就是为什么我建议在所有查询中为所有列引用使用限定列名的原因之一。您的预期逻辑:
INSERT INTO #target
SELECT S.*
FROM #source S
WHERE NOT EXISTS
(
SELECT 1
FROM #target t
WHERE t.SourceDescr = S.SourceDescr
);
会产生编译时错误并且永远不会执行。
推荐阅读
- c# - .NET CORE 3.1 ApiController 装饰器是否使用 System.Text.Json 返回 json?
- javascript - 如何从不同的 HTML 文件调用 JavaScript 函数?
- python - 正则表达式返回两个数字?
- android - 我无法在 Android Studio 中运行模拟器
- regex - 如何在JMeter的while控制器中保存特定采样器的响应主体
- reactjs - 有没有办法在 React 中显示图像之前加载它们?
- php - 如何保护 HTML 表单免受 XSS 攻击?
- memory - 对英特尔傲腾的内存驱动技术 (IMDT) 和 DCPMM 内存模式之间的区别感到困惑
- python - 如何在 TensorFlow v2 中传递会话对象?
- react-native - react-native-document-picker uri 获取 rael 路径获取