Ключевой частью этого вопроса является «Оптимально», что означает самое быстрое время возврата. У меня есть несколько таблиц, в которых есть информация, которую я хочу. У меня нет проблем с написанием самого запроса, просто пытаясь определить, каким будет самый быстрый способ получить информацию.Как оптимально получить записи из нескольких таблиц
- аудита (Это основная таблица я хочу информации)
- Order (Остальные таблицы я хочу ограниченные данные)
- Работа
- Кредиты
Дела они общий ресурс - это учетная запись и, следовательно, учетная запись. У меня есть учетная запись, которую я ищу раньше времени. К сожалению, таблица аудита не имеет прямого внешнего ключа в соответствующей таблице учетных записей и, таким образом, чтобы определить, принадлежит ли запись аудита к моему результирующему набору, мне пришлось бы присоединиться к таблице аудита и последующим 3 таблицам по одному проверьте, относится ли запись аудита к моему идентификатору учетной записи.
Например
Select a.* from [Audits] a JOIN [Orders] o ON a.RecordID = o.OrderID
where a.RecordType = 'Order' and o.AccountID = @AccountID
union
select a.* from [Audits] a JOIN [Jobs] j on a.RecordID = j.JobID
where a.RecordType = 'Job' and j.AccountID = @AccountID
...
я намерен делать выборку следующего по первому набору данных, а затем заполнить информацию из вторичных таблиц, так что я делаю ограниченный удар изначально. Я рассматриваю это как проблему с двумя частями, сначала самый быстрый способ найти AuditID, принадлежащий моему подмножеству, и второй самый быстрый способ заполнить недостающие данные. Мы ценим любые предложения.
EDIT 1
Я придумал решение сейчас, но мне было бы интересно узнать, есть ли простые способы оптимизировать его, так что я собираюсь отправить его здесь надеется, что это поможет прояснить проблему. Если вы заметили ошибки синтаксиса, просто проигнорируйте их, я пытаюсь удалить как можно больше ненужной информации.
Create Table #AuditTemp (columns)
Insert into #AuditTemp a.*, null as [Extra1], null as [Extra2] ...
From [Audits] a
Left Join [Orders] o ON a.RecordID = o.OrderID
Left Join [Jobs] j ON a.RecordID = j.JobID
Left Join [Credits] c ON a.RecordID = c.CreditID
Where o.AccountID = @AccountID or j.AccountID = @AccountID ...
Order By Time desc
OFFSET @offset ROWS FETCH NEXT @PageSize ROWS ONLY
Update #AuditTemp Set [Extra1] = o.[Column1] ...
From [Orders] Where o.AccountID = @AccountID and #AuditTemp.RecordID = o.OrderID
...
Поэтому я получаю 20 записей, которые мне нужны, а затем заполняю их по одному, если они совпадают.
Позвольте мне убедиться, что я правильно понял: поле «RecordID» из таблицы «Audit» может быть либо ордером, либо заданием, либо кредитом, и единственное, что они разделяют, это поле «AccountID»? –
Это выглядит ... весело. Единственное, что приходит на ум, это использовать 'union all' вместо' union'. Это пропустит лишнюю сортировку и дедупликацию из 'union'. – SqlZim
Какую версию и версию SQL Server вы используете? 'select @@ version' – SqlZim