Нахождение пропущенного числа между таблицами в SQL - PullRequest
1 голос
/ 11 сентября 2009

Я работаю над следующими 2 таблицами в Oracle 10g. Я пытаюсь выполнить довольно простую задачу, но не могу правильно сформулировать свой запрос, возможно, из-за недостатка понимания основ. Я хочу запросить account_no из TEMP, которого нет в 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 ]

3 голосов
/ 12 сентября 2009

Вы хотите все значения столбцов, которые находятся в одном наборе данных (temp), но не в другом (bmf)? Вот что делает оператор "Минус" .

select account_no from TEMP
minus
select account_no from bmf

EDIT: добавлена ​​ссылка на документ

3 голосов
/ 11 сентября 2009
SELECT account_no FROM temp 
WHERE NOT EXISTS (SELECT account_no FROM bmf 
                  WHERE bmf.account_no = temp.account_no)


Это будет иметь тот же план выполнения, что и SQL, в других ответах, но он более четко (по крайней мере, для меня) указывает намерение.

1 голос
/ 11 сентября 2009

Попробуйте

 select a1.account_no from TEMP a1 left join bmf a2 
 where a2.tracking_id between 72422912 and 72424283
 and a2.account_no = NULL

использовать левое соединение, а затем принимать только те записи, у которых нет соответствующей записи

1 голос
/ 11 сентября 2009

Ваш синтаксис объединения не рекомендуется для внешних объединений.

Вы можете сделать левое внешнее соединение и исключить несоединенные столбцы; это должен быть наиболее эффективный подход. Как то так:

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
1 голос
/ 11 сентября 2009
SELECT account_no 
FROM TEMP
WHERE acount_no NOT IN (SELECT account_no FROM BMF)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...