Как написать sql для этой логики? - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть следующие таблицы (это сокращенно)

tableAssignments
    id
    timestamp             // updated when row is modified
    tableSystems
    tableUsers
    ...

tableAssignmentsSnapshot
    id
    timestamp             // set when row created, snapshots never change
    tableSystemsSnapshot
    tableUsersSnapshot
    tableAssignments_id   // reference to "tableAssignments" row this was created from
    syncKey               // Changed when snapshots are created, max value is latest

Через некоторое время после изменения табличных назначений делаются снимки всех назначений, и моментальные снимки создаются с тем же syncKey. Я пытаюсь написать запрос, чтобы проверить, являются ли последние "tableAssignmentsSnapshot" актуальными или новые должны быть приняты. Необходимая логика:

  1. Определите последние таблицыAssignmentSnapshots для каждой системы, которые определяются максимальным значением syncKey (см. Запрос ниже).

  2. Соедините результат из # 1 с таблицей назначений.

  3. Если временная метка из tableAssignments> timestamp из tableAssignmentsSnapshot, требуется новый моментальный снимок.

Следующий запрос выполняет шаг # 1 и выполняется быстро. Он возвращает tableAssignmentSnapshots с наибольшим значением syncKey для каждой системы.

select * from
    tableAssignmentsSnapshot d inner join tableSystemsSnapshot e
    on d.systemId = e.id
    where d.syncKey = (select MAX(syncKey) from tableAssignmentsSnapshot y inner join tableSystemsSnapshot z
  on y.systemId = z.id
   where tableSystems_id = e.tableSystems_id)

Я борюсь с тем, что делать дальше. Мне нужно иметь возможность сделать что-то вроде следующего, но у меня проблемы с синтаксисом требуется:

select * from tableAssignments a right outer join
(
    the result from above query
)
on a.id = ?.tableAssignments_id

1 Ответ

0 голосов
/ 10 февраля 2012

Вы можете поместить свой первый запрос в CTE:

;WITH CTE AS
(
    SELECT * -- Here you should list only the columns that you are gonna need
    FROM tableAssignmentsSnapshot D
    INNER JOIN tableSystemsSnapshot E
        ON D.systemId = E.id
    WHERE D.syncKey = ( select MAX(syncKey) from tableAssignmentsSnapshot y inner join tableSystemsSnapshot z
                        on y.systemId = z.id
                        where tableSystems_id = e.tableSystems_id)
)

SELECT * 
FROM tableAssignments A
RIGHT JOIN CTE B
ON A.id = B.tableAssignments_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...