Смешивание внутренних и внешних объединений в SQL Server 2008 - PullRequest
1 голос
/ 12 ноября 2011

У меня есть база данных с 3 таблицами. Эти таблицы представляют информацию о членстве. Я хочу получить результаты только для групп, которым не принадлежит конкретный пользователь. Я не уверен, как это сделать. В настоящее время я смотрю на следующее:

SELECT
  g.*,
  a.*
FROM    
  GroupInfo g 
    INNER JOIN [Address] a ON a.[ID]=g.[AddressID]
    OUTER JOIN [GroupMembership] m ON m.[GroupID]=g.[ID]
WHERE
  m.[MemberID]<>@memberID

Я беспокоюсь о точности и производительности. Я иду правильным путем?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2011

У меня были вопросы о том, какой из этих двух методов был быстрее, поэтому я написал код теста. Я создал 2 таблицы, первая из которых содержит внешний ключ ко второй. Затем я сделал миллион записей в таблице 1, и примерно половина из них сделала связанную запись в таблице 2.

Затем я запустил версию соединения и версию подзапроса. Они оба придумали одинаковые значения (хорошо).

Интересно, что он работал примерно так же: около 20 секунд на моей жалкой рабочей станции. Так что, кажется, не имеет значения, если вы делаете это так, как вы предлагали или другим способом. Если возможно, чтобы объединенная таблица имела более одного значения, я думаю, что добавление верхней 1 к подзапросу будет быстрее.

Select * From GroupInfo g Inner Join Address a
   On a.Id = g.AddressId
Where Not Exists
(Select Top 1 * From GroupMembership Where GroupID = g.GroupID
  And MemberID = @memberID)
0 голосов
/ 12 ноября 2011

Другой подход

 Select * From GroupInfo g Join Address a
     On a.Id = g.AddressId
 Where Not Exists
    (Select * From GroupMembership 
     Where GroupID = g.GroupID
        And MemberID = @memberID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...