Выбор первой строки из многих объединений SQL - PullRequest
1 голос
/ 02 апреля 2010

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

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;

Я получаю сообщение об ошибке в четвертой строке: "old". "Revision": неверный идентификатор

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

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, чтобы сопоставить его с ревизией.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2010

Что-то вроде этого может работать, это называется эксклюзивным левым соединением:

....
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. Я не думаю, что вы можете группировать СОЕДИНЕНИЯ и следовать за ними с группой условий ВКЛ. ON должен следовать непосредственно за JOIN.

1 голос
/ 02 апреля 2010

Вы можете использовать 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];

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

...