Справка по SQL-запросам - PullRequest
1 голос
/ 17 апреля 2009

Дубликат:

Как сделать выбор в выборе

У меня есть 2 таблицы:

TABLE1
Table1Id

TABLE2
Table2Id
Table1Id
UserId

TABLE2 содержит тысячи записей. Я хочу вернуть список записей TABLE1, для которых нет записи в TABLE2 для конкретного пользователя Итак, где нет записи внешнего ключа в TABLE2. Запрос типа:

select count(*) from TABLE1 where Table1Id not in (
select Table1Id from TABLE2 where id_user = 1)

Однако этот запрос выполняется очень медленно. Какой самый эффективный способ получить требуемые результаты?

Ответы [ 4 ]

4 голосов
/ 17 апреля 2009

Есть похожий вопрос

Я думаю, что было бы лучше

SELECT COUNT(*) 
FROM TABLE1 
WHERE NOT EXISTS (SELECT Table1Id FROM TABLE2 WHERE TABLE2.Table1Id = TABLE1.Table1Id AND UserID = 1)

Я бы тоже проверил индексы, как предложил ck

1 голос
/ 17 апреля 2009

Также можно использовать пересечение «ИСКЛЮЧИТЬ / МИНУС», чтобы получить только различия между двумя таблицами, если выборка возвращает одинаковые типы полей / порядок.

SELECT TABLE1ID
FROM TABLE1
EXCEPT -- or MINUS in Oracle
SELECT TABLE1ID
FROM TABLE2
WHERE USER_ID = 1
1 голос
/ 17 апреля 2009

А как же

select Table1Id from TABLE1 
minus
select Table1Id from TABLE2 where id_user = 1

Я не уверен, это поддержка MsSql минус. Если нет, вам следует попробовать коррелированный подзапрос.

0 голосов
/ 17 апреля 2009

См. Как сделать выбор в выборе

Кроме того, убедитесь, что все поля, к которым вы обращаетесь, имеют подходящий индекс.

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