Запросы к таблицам с несколькими записями, отслеженными по дате - PullRequest
2 голосов
/ 20 июня 2011

У меня есть несколько таблиц 7 или более. Существует главная таблица, а все остальные - дочерние таблицы (от FK до идентификатора первичного столбца основной таблицы). Все таблицы имеют несколько записей для данного идентификатора, включая основную таблицу, и они отслеживаются по дате (дата вступления в силу). И самая последняя запись даты считается активной записью в каждой таблице.

Существует ли быстрый и лучший способ присоединиться к ним и вернуть самые последние записи из каждой таблицы? Сейчас я выбираю max из каждой таблицы и присоединяюсь к ней, чтобы получить последние записи из разных таблиц.

Ответы [ 3 ]

0 голосов
/ 20 июня 2011

вы можете написать что-то вроде этого:

select * from masterTable m
cross apply (select top 1 null as dummy from masterTable m2 where m2.id= m.id order by m2.effectDate desc) mm1
cross apply (select top 1 * from detailTable1 d1 where d1.masterId = m.id order by d1.effectDate desc) dd1
cross apply (select top 1 * from detailTable2 d2 where d2.masterId = m.id order by d2.effectDate desc) dd2
cross apply (select top 1 * from detailTable2 d2 where d3.masterId = m.id order by d3.effectDate desc) dd2

У меня нет ваших таблиц, поэтому я не могу проверить это, надеюсь, это поможет.

0 голосов
/ 21 июня 2011

Поскольку у вас есть inkex (id, effdt), я думаю, что вы уже описали наиболее эффективный способ запроса схемы.По крайней мере, метод, который вы описываете, - это способ, которым я это делаю ...

SELECT
  *
FROM
  master
INNER JOIN
  child1
    ON child1.id = master.id
INNER JOIN
  child2
    ON child2.id = master.id
WHERE
      master.effdt = (SELECT TOP 1 effdt FROM master AS lookup WHERE id = master.id)
  AND child1.effdt = (SELECT TOP 1 effdt FROM child1 AS lookup WHERE id = child1.id)
  AND child2.effdt = (SELECT TOP 1 effdt FROM child2 AS lookup WHERE id = child2.id)

Разрешение различных подзапросов (я использую TOP 1, MAX () также работает) затем становится поиском по индексу.

Есть альтернатива, хотя я не помню, чтобы было какое-то существенное повышение производительности ...

SELECT
  *
FROM
  (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY effdt), * FROM master) AS master
INNER JOIN
  (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY effdt), * FROM child1) AS child1
    ON child1.id = master.id
INNER JOIN
  (SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY effdt), * FROM child2) AS child2
    ON child2.id = master.id
WHERE
      master.seq_id = 1
  AND child1.seq_id = 1
  AND child2.seq_id = 1

Кроме того, как упоминалось Мазиаром, есть опция CROSS APPLY ...

SELECT
  *
FROM
  master
CROSS APPLY
  (SELECT TOP 1 * FROM child1 WHERE id = master.id ORDER BY effdt DESC) AS child1
CROSS APPLY
  (SELECT TOP 1 * FROM child2 WHERE id = master.id ORDER BY effdt DESC) AS child2
WHERE
  master.effdt = (SELECT TOP 1 effdt FROM master AS lookup WHERE id = master.id)
0 голосов
/ 20 июня 2011

Возможно создание представления для всех таблиц, которые возвращают TOP 1 каждой таблицы ORDER BY дата вступления в силу.

Затем в основном запросе выполните JOIN для всех этих представлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...