Помогите не вписываться, а во внутреннее объединение - PullRequest
2 голосов
/ 27 января 2011

У меня есть две таблицы.Table1 и Table2

Table1

id tid
1  100
2  200
3  300

Table2

tid name
100 A
200 B

Я хочу вынести id записей изTable1, какой бы tid не присутствовал в Table2.

Мой вывод должен быть таким.

Table1.id

3

Для этого у меня естьнаписано следующие запросы, но это занимает слишком много времени.Поскольку в обеих таблицах содержится больше записей.

, пожалуйста, помогите мне, как написать запрос для этого, чтобы это заняло меньше времени.

select id from Table1 where tid not in (select tid from Table2)
select a.id from Table1 a inner join Table2 b on a.tid<>b.tid

TIA.

Ответы [ 4 ]

8 голосов
/ 27 января 2011

Используйте левое соединение, а затем используйте предложение WHERE, чтобы отфильтровать только те строки, где объединение не сработало:

SELECT
     a.ID
from
     Table1 a
         left join
     Table2 b
         on
            a.tid = b.tid
where
    b.tid is null

Конечно, это все еще может работать недостаточно быстро, и в этом случаевам нужно проверить, есть ли у вас индексы в столбцах tid в этих двух таблицах.

3 голосов
/ 27 января 2011

Как насчет

select id
from table1
where tid IN (
  select tid from table1
  minus
  select tid from table2 
)

операций над множествами (за вычетом части выше) довольно быстры в Oracle

1 голос
/ 27 января 2011

Первое создание индексов:

CREATE INDEX t1_tid ON table1 (tid ASC);
CREATE INDEX t2_tid ON table2 (tid ASC);

Таким образом, это может быть быстрее.

Что касается запроса, как насчет:

SELECT tid FROM table1
MINUS
SELECT tid FROM table2
0 голосов
/ 27 января 2011

Вы также можете попробовать "не существует":

выберите * из таблицы T1, где не существует (выберите 1 из таблицы 2 T2, где T1.tid = t2.tid);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...