在SQL中查找表之间缺少的数字

时间:2009-09-11 06:34:18

标签: sql oracle oracle10g

我正在研究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

任何有正确查询的指针都会有所帮助

此致 新手

5 个答案:

答案 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
相关问题