Здравствуйте, gandjustas, Вы писали:
EP>>EP>> auto q = select(Suppliers::CompanyName, Products::ProductName).where(Products::UnitPrice > 11.99_USD); // auto join
EP>>
G>1) А если связи между таблицами нет?
Компилятор выдаст ошибку, а пользователь будет должен составить явный join.
G>2) А если связи две?
Возможны разные варианты реакции:
1) Ошибка компиляции так как неоднозначность. Пользователь должен выбрать связь или сделать явный join.
2) Некие правила для предпочтения связей.
Вообще, даже древний MS Access умел автоматически строить CRUD запросы по заданному списку полей из разных таблиц (как в примере выше).
G>3) Если все таки сделаем ошибку что нам укажет компилятор?
Какую именно?
Во время компиляции доступны данные об: таблицах, их полях/ключах, связях между ними, дерево запроса.
Всё это можно обрабатывать (во время компиляции) языком полным по Тьюрингу, делать какие угодно трансформации, обходить граф связей, дерево запроса, генерировать SQL, и останавливать компиляцию с ошибкой по любому возможному условию.
Например можно выполнять поиск пути между двумя таблицами по графу связей — и если такого пути нет или он не единственен (или какая там логика обычно применяется) — то выдавать ошибку компиляции при попытке вызывать такой auto join.
G>4) Что будет если у нас в трех таблицах будет поле ID?
Вопрос про что?
Если про alias — то это элементарно реализуется через дополнительный синтаксис as, пример есть в sqlpp11.
Если же про natural join по одинаковым колонкам, то я этого не предлагал (хотя это также возможно реализовать) — я подразумевал что пример выше использует информацию о связях.