sql, внешнее соединение - PullRequest
0 голосов
/ 21 мая 2011

У меня есть две таблицы, связанные с внешним соединением. Соотношение между первичной и вторичной таблицами составляет от 1 до [0..n]. Вспомогательная таблица содержит столбец отметки времени, указывающий, когда была добавлена ​​запись. Я хочу получить только самую последнюю запись вторичной таблицы для каждой строки в первичном . Я должен использовать группу на основной таблице из-за других таблиц, также являющихся частью SELECT. Тем не менее, нет способа использовать предложение «has», поскольку эта вторичная таблица не является частью группы.

Как я могу сделать это без выполнения нескольких запросов?

Ответы [ 4 ]

3 голосов
/ 21 мая 2011

Для производительности, попробуйте дотронуться до стола минимум раз

Вариант 1, НАРУЖНОЕ ПРИМЕНЕНИЕ

SELECT *
FROM
   table1 a
  OUTER APPY
  (SELECT TOP 1 TimeStamp FROM table2 b
   WHERE a.somekey = b.somekey ORDER BY TimeStamp DESC) x

Вариант 2, Агрегат

SELECT *
FROM
  table1 a
  LEFT JOIN
  (SELECT MAX(TimeStamp) AS maxTs, somekey FROM table2
   GROUP BY somekey) x ON a.somekey = x.somekey

Примечание: каждая таблица упоминается один раз, никаких коррелированных подзапросов

1 голос
/ 21 мая 2011

Что-то вроде:

SELECT a.id, b.* 
FROM table1 a
INNER JOIN table2 b ON b.parentid = a.id
WHERE b.timestamp = (SELECT MAX(timestamp) FROM table2 c WHERE c.parentid = a.id)

Используйте LEFT JOIN вместо INNER JOIN, если хотите отображать строки для идентификаторов в таблице1 без каких-либо совпадений в таблице2.

0 голосов
/ 21 мая 2011

Самый быстрый способ, которым я знаю, это:

SELECT
  A.*,
  B.SomeField
FROM
  Table1 A
  INNER JOIN (
    SELECT
      B1.A_ID,
      B1.SomeField
    FROM
      Table2 B1
      LEFT JOIN Table2 B2 ON (B1.A_ID=B2.A_ID) AND (B1.TimeStmp < B2.TimeStmp)
    WHERE
      B2.A_ID IS NULL
  ) B ON B.A_ID = A.ID
0 голосов
/ 21 мая 2011
select *
from table1 left outer join table2 a on
   table1.id = a.table1_id
where
  not exists (select 1 from table2 b where a.table1_id = b.table1_id and b.timestamp > a.timestamp)
...