2016-03-12 2 views
-1

У меня есть база данных, которая имеет Автор (номер, имя), AuthorPublication (помощь, ИДП), публикацию (идентификатор, название)захватный данные из БД ORACLE

Author.id ссылки на AuthorPublication.aid, AuthorPublication.pid ссылки на Publication.od.

Я пытаюсь написать запрос, который возвращает имя авторов, которые были соавторами с «amol» или «samuel», НО НЕ ОБА.

До сих пор я

Select name 
From Author, AuthorPublication, Publication 
Where Publication.id = PID AND aid = Author.id 

В приведенном выше коде нужно фильтровать PID быть авторы, чьи PID матчи автор «Сэмюэль» или «аттомоль». Но не оба

Будучи новым для oracle db, я не уверен, как это реализовать, любая помощь?

Заранее благодарен!

+1

(1) Научитесь использовать явный синтаксис 'JOIN' с предложением' ON'; (2) Запятая ничего не означает в предложении 'WHERE'. –

+0

О, я прав, я попробую ПРИСОЕДИНЯЮТСЯ, хороший намек! – bZhang

+0

Существует два основных стандарта для SQL. Использование 'from t1, t2, где t1.key = t2.key' является законным диалектом внутреннего соединения SQL, используемого oracle. @GordonLinoff ссылается на стандарт ANSI, используя ключевые слова 'JOIN' и' ON1' – Beege

ответ

1

Logic? В принципе, получить идентификатор двух авторов, получить какой-либо pid из их публикаций, эти pids не могут быть одинаковыми .... затем используйте полученные идентификаторы публикации. Есть несколько способов сделать это в 1 запрос, вот один из способов использования псевдонимов таблиц для использования таблицы более чем один раз в одном запросе:

select auth_sam.name as sams_name 
     ,auth_amol.name as amols_name 
     ,nvl(auth_sam.name, auth_amol.name) as single_author_name 
     ,s_pubinfo.title as sam_publication_titles 
     ,a_pubinfo.title as amol_publication_titles 
     ,nvl(s_pubinfo.title, a_pubinfo.title) as single_pub_name 
from author auth_sam 
    ,authorPublication sam_pubs 
    ,publication s_pubinfo -- 3 aliases for samuel data 
    ,author auth_amol 
    ,authorPublication amol_pubs 
    ,publication a_pubinfo -- 3 aliases for amol data 
where auth_sam.name = 'samuel' 
and auth_sam.id = sam_pubs.aid -- pubs by samuel 
and sam_pubs.pid = s_pubinfo.id -- samuel titles 
and auth_amol.name = 'amol' 
and auth_amol.id = amol_pubs.aid -- pubs by amol 
and amol_pubs.pid = a_pubinfo.id -- amol titles 
and sam_pubs.pid != amol_pubs.pid -- not the same publication 

Из-за !=, запрос эффективно возвращает 2 набора результатов. Записи для «samuel» будут иметь заполненный столбец «sams_name», а столбец «amols_name» будет пустым. Записи для «amol» будут иметь заполненный им столбец имени, а значение столбца имени samuel будет равно null. Из-за этих нулей я включил два столбца, используя NVL(), чтобы продемонстрировать метод для выбора значения поля поля автора и значения поля названия. (Не очень «чистое» решение, но я думаю, что он демонстрирует несколько идей в силе реляционной логики и SQL.)

Кстати, в этом примере я действительно думаю, что SQL более читабельна с синтаксисом Oracle SQL. Версия ANSI SQL со всеми ключевыми словами JOIN и ON с трудом читается.

+0

Это имеет смысл, спасибо! – bZhang

Смежные вопросы