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,为什么会这样?
答案 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 是
与无投影相同。
在存在测试中,没有投影,即没有列
选择。所有关键信息都位于FROM
和WHERE
中。一种
row(整行)是否符合WHERE
测试。
该行的值不会在任何地方返回。无法使用
例如,外部查询。 “选择”毫无意义;是的
只是因为语法需要它。
通过说SELECT 1
,我们强调它是布尔测试,
本身没有被“选择”。