如何处理重复密钥

kq4fsx7k  于 2021-06-15  发布在  Mysql
关注(0)|答案(4)|浏览(323)

待定
身份证件
待定
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,这是为什么?

oyxsuwqo

oyxsuwqo1#

这样怎么样:

SELECT a.id
FROM tblA AS a
LEFT JOIN tblB as b
ON a.id = b.id
WHERE b.id IS NULL

这应该会给出a中不存在于b中的所有值,仅与b.id进行比较

lc8prwob

lc8prwob2#

试试这个:

SELECT id FROM tblA WHERE id IN (SELECT id FROM tblB) AND id NOT IN (SELECT id2 FROM tblB)
eiee3dmh

eiee3dmh3#

如果我理解你的问题,应该很简单。您只需要tbla.id与tblb.id不匹配的tbla行。tblb.id2不重要。

SELECT * FROM tblA WHERE id NOT IN (SELECT tblb_ID FROM tblB)

如前所述,您的原始查询应该可以工作。根据您的更新信息,这看起来是正确的查询:

SELECT id
FROM tblA as a
WHERE NOT EXISTS 
(
    SELECT * FROM tblB AS b
    WHERE a.id = b.tblb_ID
)
q9rjltbz

q9rjltbz4#

中列的描述 tblB 与示例数据不一致,第一列显示为 tblb_ID . 如果那是正确的名字,那么

SELECT id
FROM tblA as a
WHERE NOT EXISTS 
(
SELECT * FROM tblB AS b
WHERE a.id = b.id
)

无效,应标记为语法错误,因为没有 b.id . 如果不是这样的话,你有一个bug要报告。
也就是说,我会将建议的修复修改为

SELECT id
FROM tblA as a
WHERE NOT EXISTS 
(
    SELECT 1 FROM tblB AS b
    WHERE a.id = b.tblb_ID
)

因为这简化了查询处理器的工作,更好地传达了您的意图。
的意义 SELECT 因此 SELECT * 经常被误解。 SELECT 是关系代数中project的sql实现:它指定返回哪些列(而不是行)。 SELECT * 返回所有列;如果sql不是第四代语言时代的遗物,我们可以不使用它 SELECT * 因为所有的投影都和没有投影一样。
在存在性测试中,没有投影,即没有选择列。所有关键信息都在 FROM 以及 WHERE . 一排——整排——要么遇到 WHERE 测试或不测试。行的值不会在任何位置返回。例如,它对外部查询不可用。“选择”毫无意义;它之所以存在,只是因为语法需要它。
通过说 SELECT 1 ,我们强调的是,这是一个布尔测试,没有什么是被“选择”本身。

相关问题