Поиск несоответствий при объединениях
Допустим есть 2 таблицы авторов и редакторов (authors,editors).Как можно при помощи объединения выявить редакторов,не написавших ни одной книги(не состоящих в таблице авторов).Он пишет следующий код:
select e.ed_name
from editors e,authors a
where e.ed_id<>a.au.id
где ed_id и au_id ключи к соответствующим таблицам.
Но тогда ничего не получается-ведь идет декартово произведение и например в одном из его фрагментов будет
РЕДАКТОРЫ АВТОРЫ
сидоров петров
сидоров иванов
сидоров сидоров
Он просто икслючит последнюю строку,а первые 2 останутся и после оператора distinct сидоров будет в списке редакторов,не написавших ни одной книги,хотя это неверно.
Заранее спасибо.
Цитата:
Originally posted by Dutch Shultz
Начал изучать БД по книге Тихомирова MS SQL и не могу разобраться в одном моменте из этой книги.
Допустим есть 2 таблицы авторов и редакторов (authors,editors).Как можно при помощи объединения выявить редакторов,не написавших ни одной книги(не состоящих в таблице авторов).Он пишет следующий код:
select e.ed_name
from editors e,authors a
where e.ed_id<>a.au.id
где ed_id и au_id ключи к соответствующим таблицам.
Но тогда ничего не получается-ведь идет декартово произведение и например в одном из его фрагментов будет
РЕДАКТОРЫ АВТОРЫ
сидоров петров
сидоров иванов
сидоров сидоров
Он просто икслючит последнюю строку,а первые 2 останутся и после оператора distinct сидоров будет в списке редакторов,не написавших ни одной книги,хотя это неверно.
Заранее спасибо.
Начал изучать БД по книге Тихомирова MS SQL и не могу разобраться в одном моменте из этой книги.
Допустим есть 2 таблицы авторов и редакторов (authors,editors).Как можно при помощи объединения выявить редакторов,не написавших ни одной книги(не состоящих в таблице авторов).Он пишет следующий код:
select e.ed_name
from editors e,authors a
where e.ed_id<>a.au.id
где ed_id и au_id ключи к соответствующим таблицам.
Но тогда ничего не получается-ведь идет декартово произведение и например в одном из его фрагментов будет
РЕДАКТОРЫ АВТОРЫ
сидоров петров
сидоров иванов
сидоров сидоров
Он просто икслючит последнюю строку,а первые 2 останутся и после оператора distinct сидоров будет в списке редакторов,не написавших ни одной книги,хотя это неверно.
Заранее спасибо.
Тихомирова не читал, но судя по примеру - ерунда ! Объединением отсутствия записей в таблице никогда не выделить. Для этого используется конструкция not exists или in, или any с subquery в where условии.
select e.ed_name
from editors e
where e.ed_id not in (select a.au_id from authors a)
Best wishes !
select e.ed_name
from editors e left join authors a on a.au_id=e.ed_id
where a.au.id is null
Цитата:
Originally posted by Dutch Shultz
Начал изучать БД по книге Тихомирова MS SQL и не могу разобраться в одном моменте из этой книги.
Допустим есть 2 таблицы авторов и редакторов (authors,editors).Как можно при помощи объединения выявить редакторов,не написавших ни одной книги(не состоящих в таблице авторов).Он пишет следующий код:
select e.ed_name
from editors e,authors a
where e.ed_id<>a.au.id
где ed_id и au_id ключи к соответствующим таблицам.
Но тогда ничего не получается-ведь идет декартово произведение и например в одном из его фрагментов будет
РЕДАКТОРЫ АВТОРЫ
сидоров петров
сидоров иванов
сидоров сидоров
Он просто икслючит последнюю строку,а первые 2 останутся и после оператора distinct сидоров будет в списке редакторов,не написавших ни одной книги,хотя это неверно.
Заранее спасибо.
Начал изучать БД по книге Тихомирова MS SQL и не могу разобраться в одном моменте из этой книги.
Допустим есть 2 таблицы авторов и редакторов (authors,editors).Как можно при помощи объединения выявить редакторов,не написавших ни одной книги(не состоящих в таблице авторов).Он пишет следующий код:
select e.ed_name
from editors e,authors a
where e.ed_id<>a.au.id
где ed_id и au_id ключи к соответствующим таблицам.
Но тогда ничего не получается-ведь идет декартово произведение и например в одном из его фрагментов будет
РЕДАКТОРЫ АВТОРЫ
сидоров петров
сидоров иванов
сидоров сидоров
Он просто икслючит последнюю строку,а первые 2 останутся и после оператора distinct сидоров будет в списке редакторов,не написавших ни одной книги,хотя это неверно.
Заранее спасибо.