Как в Вывести обединение таблиц по условию ??

Всем привет.
Подскажите: Есть огромная таблица, по сути каталог с одним условием where и штук 30 joinov.
Используется 3 CTE.

Сложно сформулировать но я попробую на книгах.

Есть таблица книг , есть таблица авторов - они Объединенные в один каталог

Если в каталоге Книг есть книга с кодом 1, а в каталоге Авторов есть Предок книги (полученный через CTE) с кодом 1 и 2, то вывести только одну строку с кодом 1.
А ЕСЛИ в каталоге книг Код Автора книги не совпадает Ни с одним кодом Книги в каталоге автора , то написать слово «ПУСТО» или оставить пустую ячейку.

Первый вариант я сделал через inner join, но как сделать это по условию, при несовпадении чтоб выводились строки ПУСТО я не знаю, с таким никогда не сталкивался.
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 3
Mikhail_E
@Mikhail_E
1С, SQL
Для описанного примера подходит left join, а для вывода строки при несовпадении использовать функции IsNull и Cast :

TSQL пример

Результат :

+==================+======+===========+
| name             | code | AutorCode |
+==================+======+===========+
| BookWithAutor    | 1    | 1         |
+------------------+------+-----------+
| BookWithoutAutor | 3    | Empty     |
+------------------+------+-----------+
Ответ написан
@Miron11
Пишу sql 20 лет. Срок :)
Книга без автора?
Код книги в списке авторов?
Если первое ещё возможно, если запись утеряна, то второе, это скорее пережиток ручной учетной записи, которую не стоит мучать в СУБД.
Может не так элегантно, но понятнее сделать UNION
1. select ..., min(author_id) from books inner join authors on books.author_id = authors.author_id
group by ...
2. select ..., 'empty' as author_id from books where not exists ( select 1 from authors where author_id = books.author_id)
и представить их
1 union 2
-- CTE прекрасно работают с union, их надо вынести в предъём выражения.
-- Если у авторов есть взаимоотношения родитель - ребенок, то эти взаимоотношения и отслеживаются в CTE, там же задается указатель уровня, по которому можно выбрать старшую запись в выборке ( where parent_level = 1 )
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы