如何处理重复的密钥

时间:2018-12-05 19:22:33

标签: mysql sql

tblA

id

tblB

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中不存在

样本数据

tblA

ID 
1
2 
3
4 

tblB

tblb_ID   | ID2 
3         | 34
4         | 38 
12        | 93
43        | 54
54        | 4

预期结果

1,2,因为1和2在tblB中不存在。

我能得到的

仅1,因为ID2中存在4,为什么会这样?

4 个答案:

答案 0 :(得分:0)

尝试一下:

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

答案 1 :(得分:0)

怎么样呢?

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进行比较

答案 2 :(得分:0)

如果我理解您的问题,应该非常简单。您只需要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
)

答案 3 :(得分:0)

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

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

无效,应将其标记为语法错误,因为没有 b.id。如果不是这种情况,则需要报告一个错误。

也就是说,我将建议的修订修改为

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 *,因为 project all 是 与无投影相同。

在存在测试中,没有投影,即没有列 选择。所有关键信息都位于FROMWHERE中。一种 row(整行)是否符合WHERE测试。 该行的值不会在任何地方返回。无法使用 例如,外部查询。 “选择”毫无意义;是的 只是因为语法需要它。

通过说SELECT 1,我们强调它是布尔测试, 本身没有被“选择”。