Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Параметры для возврата различных значений через внутреннее соединение

Автор вопроса: Michael HarnessОтветов: 1

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

Таблица A содержит UserID, UserName

Таблица B содержит ID, FK_UserID, ClientName

Мне нужно вернуть список отдельных A.UserName, где A.Username существует в таблице B и к ним прикреплено хотя бы одно ClientName, но в моем запросе посмотрите только на отдельный B.ClientName.

Мои мысли были:

Select Distinct A.UserName from A as A
Inner Join B as B
on A.UserID = B.FK_UserID

Но это различается только в таблице A

Следующей моей мыслью было:

Select Distinct Username from A
where UserID In
(
Select FK_UserID, distinct ClientName from B)

Мне сказали, что есть способ сделать разные таблицы в объединении, потому что, если таблица A состоит из 300 строк, а таблица B - из 3 миллиардов строк, мой первоначальный запрос займет некоторое время.

Этот человек специально хочет, чтобы я использовал внутреннее соединение...

  • Что вы имеете в виду в моем запросе, посмотрите только на distict B.ClientName? Вы не возвращаете ClientName в результатах, не так ли? Что это значит в таком случае? Jason Goemaat 24.04.2014

sqljoindistinct

Ответы

Ответ 1 · рейтинг 2 · Gordon Linoff

Ваш исходный запрос:

Select Distinct A.UserName
from A as A Inner Join
     B as B
     on A.UserID = B.FK_UserID;

Это может быть проблемой, если в b много совпадений. Использование in не совсем правильное решение. Вместо этого используйте exists:

select a.UserName
from a
where exists (select 1
              from b
              where b.fk_UserID = a.UserId
             )

Затем убедитесь, что у вас есть индекс на b(fk_UserId).

Это должно сделать около 300 поисковых запросов в индексе. Это должно быть довольно быстро.

Мой совет тому, кто сказал вам использовать внутреннее соединение: напишите специальную версию для этого человека. В течение многих минут или часов, которые требуются для запуска, пусть другие люди используют более быструю версию, используя exists.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы