待定
身份证件
待定
id,id2
我想检查tbl b id中是否存在tbl a id,但不查看id2,tblb中的id2列将具有tbla中存在的键。
SELECT id
FROM tblA as a
WHERE NOT EXISTS
(
SELECT * FROM tblB AS b
WHERE a.id = b.id
)
从逻辑上讲,这应该是可行的,但出于某种原因,它还提供了tblb中id2列中存在的值,而tbla id中不存在这些值
样本数据
待定
ID
1
2
3
4
待定
tblb_ID | ID2
3 | 34
4 | 38
12 | 93
43 | 54
54 | 4
预期结果
因为tblb中不存在1和2。
我得到的,
只有1,因为id2中存在4,这是为什么?
4条答案
按热度按时间oyxsuwqo1#
这样怎么样:
这应该会给出a中不存在于b中的所有值,仅与b.id进行比较
lc8prwob2#
试试这个:
eiee3dmh3#
如果我理解你的问题,应该很简单。您只需要tbla.id与tblb.id不匹配的tbla行。tblb.id2不重要。
如前所述,您的原始查询应该可以工作。根据您的更新信息,这看起来是正确的查询:
q9rjltbz4#
中列的描述
tblB
与示例数据不一致,第一列显示为tblb_ID
. 如果那是正确的名字,那么无效,应标记为语法错误,因为没有
b.id
. 如果不是这样的话,你有一个bug要报告。也就是说,我会将建议的修复修改为
因为这简化了查询处理器的工作,更好地传达了您的意图。
的意义
SELECT
因此SELECT *
经常被误解。SELECT
是关系代数中project的sql实现:它指定返回哪些列(而不是行)。SELECT *
返回所有列;如果sql不是第四代语言时代的遗物,我们可以不使用它SELECT *
因为所有的投影都和没有投影一样。在存在性测试中,没有投影,即没有选择列。所有关键信息都在
FROM
以及WHERE
. 一排——整排——要么遇到WHERE
测试或不测试。行的值不会在任何位置返回。例如,它对外部查询不可用。“选择”毫无意义;它之所以存在,只是因为语法需要它。通过说
SELECT 1
,我们强调的是,这是一个布尔测试,没有什么是被“选择”本身。