2010-04-01 5 views
1

Хорошо, так что я собираю путь, чтобы выбрать версию конкретного романа:Выбор первой строки из многих SQL присоединяется

SELECT Catalog.WbsId, Catalog.Revision, NovelRevision.Revision 
    FROM Catalog, BookInCatalog 
    INNER JOIN NovelMaster 
     INNER JOIN HasNovelRevision 
     INNER JOIN NovelRevision 
     ON HasNovelRevision.right = NovelRevision.obid 
     ON HasNovelRevision.Left=NovelMaster.obid 
    ON NovelMaster.obid = BookInCatalog.Right 
    WHERE Catalog.obid = BookInCatalog.Left; 

Это возвращает все изменения, которые находятся в романе Мастера для каждого Новый мастер, который находится в каталоге.

Проблема в том, что я хочу только ПЕРВЫЙ пересмотр каждого нового мастера в каталоге. Как мне это сделать? О, и кстати: мой вкус sql ковыляет, как и многие другие, тем, что он не поддерживает функцию LIMIT.

**** **** UPDATE

Таким образом, используя ответ 1 в качестве руководства я модернизировал свой запрос к этому:

SELECT Catalog.wbsid 
FROM Catalog, BookInCatalog, NovelVersion old, NovelMaster, HasNovelRevision 
LEFT JOIN  NovelVersion newRevs 
ON   old.revision < newRevs.revision AND HasNovelRevision.right = newRevs.obid 
LEFT JOIN  HasNovelRevision NewerHasNovelRevision 
ON   NewerHasNovelRevision.right = newRevs.obid 
LEFT JOIN  NovelMaster NewTecMst 
ON   NewerHasNovelRevision.left = NewTecMst.obid 
WHERE Catalog.programName = 'E18' AND Catalog.obid = BookInCatalog.Left 
AND BookInCatalog.right = NewTecMst.obid AND newRevs.obid = null 
ORDER BY newRevs.documentname; 

Я получаю ошибку на четвертой строке: " «.„старая версия“: недопустимый идентификатор

рЕШЕНИЕ Ну, я должен был пойти в другой форум, но я получил рабочий раствор:

select nr1.title, nr1.revision 
from novelrevision nr1 
where nr1.revision in (select min(revision) from novelrevision nr2 
    where nr1.title = nr2.title) 

Таким образом, это решение использует JOIN, упомянутое OA, вместе с ключевым словом IN, чтобы соответствовать его ревизии.

+0

так какой вкус? – Unreason

+0

sql * plus 10.2 для Oracle – IcedDante

ответ

2

Нечто подобное могло бы работать, это называется эксклюзивным левое соединение:

.... 
INNER JOIN NovelRevision 
ON   HasNovelRevision.right = NovelRevision.obid 
LEFT JOIN NovelRevision as NewerRevision 
ON   HasNovelRevision.right = NewerRevision.obid 
      AND NewerRevision.revision > NovelRevision.revision 
... 
WHERE  NeverRevision.obid is null 

Предложение where фильтрует строки, для которых новая редакция существует. Это фактически ограничивает запрос новыми версиями.

В ответ на ваш комментарий вы можете отфильтровать только версии, которые имеют более новую редакцию в том же NovelMaster. Например:

.... 
LEFT JOIN NovelRevision as NewerRevision 
ON   HasNovelRevision.right = NewerRevision.obid 
      AND NewerRevision.revision > NovelRevision.revision 
LEFT JOIN HasNovelRevision as NewerHasNovelRevision 
ON   NewerHasNovelRevision.right = NewerRevision.obid 
LEFT JOIN NovelMaster as NewerNovelMaster 
ON   NewerHasNovelRevision.left = NewerNovelMaster.obid 
      AND NewerNovelMaster.obid = NovelMaster.obid 
.... 
WHERE  NeverNovelMaster.obid is null 

P.S. Я не думаю, что вы можете группировать JOINs и следовать им с группой условий ON. ON должен непосредственно следовать своему СОЕДИНЕНИЮ.

+0

Я отправил второй ответ, но я дам вам голосование. – Kronass

+0

Andomar: Я уже тестировал образец, который я опубликовал, и это сработало, поэтому я бы сказал, что вы ошибаетесь, полагая, что после группы JOIN не можете следовать ONs. Я также думаю, что вы хотите добавить: NewerRevision.Revision> NovelRevision.Revision, но откуда берется таблица NewerRevision? Я предполагаю, что это клон исходной таблицы, но как объявить ее в запросе? Спасибо. – IcedDante

+0

@IcedDante: NewerRevision является псевдонимом таблицы NovelRevision. Я уточню, добавив 'as' в запрос. Я никогда не видел группы JOINs: какая база данных вы используете? – Andomar

1

Вы можете использовать CTE Проверьте это

WITH NovelRevesion_CTE(obid,RevisionDate) 
AS 
(
SELECT obid,MIN(RevisionDate) RevisionDate FROM NovelRevision Group by obid 
) 
SELECT Catalog.WbsId, Catalog.Revision, NovelRevision.Revision 
    FROM Catalog, BookInCatalog 
    INNER JOIN NovelMaster 
     INNER JOIN HasNovelRevision 
     INNER JOIN NovelRevesion 
      INNER JOIN NovelRevesion_CTE 
     ON HasNovelRevision.[right] = NovelRevision.obid 
     ON HasNovelRevision.[Left]=NovelMaster.obid 
    ON NovelMaster.obid = BookInCatalog.[Right] 
    ON NovelRevesion_CTE.obid = NovelRevesion.obid 
    WHERE Catalog.obid = BookInCatalog.[Left]; 

Сначала выберите первую версию, написанную для каждого романа (предполагается, что Обид является новым foriegn ключ), беря наименьшую дату и сгруппировать их. затем добавьте его как присоединиться к вашему запросу

+0

Что обозначают скобки? Является ли очевидным, что такое SQL noob? – IcedDante

+0

Kronass - очевидно, SQL-код Oracle, который я использую, не поддерживает тактику CTE: «неподдерживаемый псевдонимы столбцов». Thnx tho. – IcedDante

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