Не существует «жестких и быстрых» правил для такого рода вещей, потому что это очень сильно зависит от структуры данных.Я думаю, что вы хорошо начинаете наблюдать, как MS Access справляется с этим.Другими хорошими вариантами было бы создать образец конструктора Entity Framework или LINQ 2 SQL в конструкторе и наблюдать, как они переводятся в SQL на внутреннем сервере.(Дизайнер соединений EF, в частности, довольно умен и гибок).
Access использует в основном левые соединения, потому что они являются «самыми безопасными», учитывая абсолютно нулевое знание структуры исходных данных.Хитрость заключается в том, чтобы попытаться разработать инструмент, который соответствует ожиданиям вашего пользователя.В конструкторе запросов Access, если я выберу таблицу, а затем подключу ее к другой таблице, наиболее вероятным сценарием является «Я хочу получить все данные из этой таблицы, но мне тоже нужно извлечь данные из этой другой таблицы», то есть слева.присоединиться.Если было произведено внутреннее объединение, и я не получил все строки в первой таблице, это было бы удивительно.
Конечно, Access также позволяет вам исправить эти правила, если вам действительно нужно,Это лучший подход: создайте разумное значение по умолчанию, которое с наименьшей вероятностью может сбить с толку вашего пользователя, а затем предоставьте ему способ изменить значение по умолчанию, если они знают лучше.
Один из вариантов - это немного перевести язык объединения в нечтовысший уровень;например, если ваши пользователи вообще знакомы с моделированием данных, они могут распознать «один-ко-многим» (внутреннее объединение) или «один-к-ну-или-большему» (внешнее объединение).Возможно, даже сделайте так, чтобы операция, которая создает объединения в вашем компоновщике, использовала совершенно другие слова, такие как «Необязательная ссылка» против «Обязательная ссылка» или даже «Таблица поиска подключений» против «Объединить дочерние данные».Узнайте, какие слова или термины думают ваши пользователи, когда они используют ваш конструктор запросов, сопоставьте их с соответствующими типами JOIN и используйте их.Опять же, разработчик EF сопоставил концепцию SQL-соединений с высокоуровневой концепцией моделирования данных родительско-дочерних отношений, которая хорошо работает.
С технической точки зрения, существуют мои личные правила написания JOIN.Некоторые из них основаны на, возможно, устаревших или устаревших представлениях о том, как оптимизировать запросы и индексы, и, возможно, в них больше нет необходимости, но они мне хорошо послужили:
- Всегда используйте синтаксис длинных форм соединения(нет ярлыков предложения WHERE
- Поместите все критерии для строк дочерней таблицы в предложение ON, когда это возможно (то есть, в моих предложениях WHERE редко есть условия, включающие поля из таблиц с внутренним объединением)
- Используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ там, где известно, что оно безопасно
- Предпочитайте ЛЕВЫЕ СОЕДИНЕНИЯ и НЕ ПОЛУЧИТЕ подзапросам, когда это возможно.
РЕДАКТИРОВАТЬ:Меня исправили из-за неверного представления о том, что JOINS работают быстрее, чем подзапросы (конечно, вы все равно собирались выполнять свои собственные тесты производительности, верно? :))