我正在研究Oracle 10g上的以下两个表。我正在尝试一个相当简单的任务,但无法正确查询我的查询,可能是因为我对基础知识缺乏了解。我想查询TEMP中的account_no,这在BMF中不存在。
两个表: 表1:BMF:1372行
account_no | trans_amount | tracking_id
8149817 | 8100 | 72422912
8197743 | 9100 | 72422913
7165129 | 8100 | 72422914
8625861 | 8100 | 72422915
8463378 | 2100 | 72422916
8213330 | 3100 | 72422917
表2:temp:1373行 - 在TEMP中只有一个account_no从BMF中丢失
account_no
8149817
8197743
7165129
8625861
8463378
8213330
84633
48
预期结果: 8463348 - BMF表中没有此数字。
我的查询:
select a1.account_no from TEMP a1, bmf a2
where a2.tracking_id between 72422912 and 72424283
and a1.account_no != a2.account_no
任何有正确查询的指针都会有所帮助
此致 新手
答案 0 :(得分:3)
SELECT account_no FROM temp
WHERE NOT EXISTS (SELECT account_no FROM bmf
WHERE bmf.account_no = temp.account_no)
这将与其他答案中的SQL具有相同的执行计划,但它更清楚地表明意图(至少对我而言)。
答案 1 :(得分:3)
您想要所有列值,它们在一组数据(临时)中但不在另一组(bmf)中?这就是"Minus" operator的作用。
select account_no from TEMP
minus
select account_no from bmf
编辑: 添加了文档链接
答案 2 :(得分:1)
SELECT account_no
FROM TEMP
WHERE acount_no NOT IN (SELECT account_no FROM BMF)
答案 3 :(得分:1)
尝试
select a1.account_no from TEMP a1 left join bmf a2
where a2.tracking_id between 72422912 and 72424283
and a2.account_no = NULL
使用左连接,然后只获取没有相应条目的条目
答案 4 :(得分:1)
Oracle的连接语法为discouraged,用于外连接。
您可以执行左外连接并排除未连接的列;这应该是最有效的方法。像这样:
SELECT a1.account_no FROM TEMP a1
LEFT JOIN bmf a2 ON a1.account_no = a2.account_no
WHERE (a2.tracking_id between 72422912 and 72424283)
AND a2.account_no IS NULL