Нужна только одна строка, вернувшаяся из ВНУТРЕННЕГО СОЕДИНЕНИЯ - PullRequest
7 голосов
/ 17 января 2011

Я бы хотел вернуть первый ряд только из внутреннего соединения.У меня есть две таблицы:

TABLE_X |  TABLE_Y
id      |  id   creationdate  xid 
1       |  1    01/01/2011    1
2       |  2    01/01/2011    1
3       |  3    31/12/2010    2
4       |  4    28/12/2010    3

Строки в ТАБЛИЦЕ Y могут иметь одинаковые даты создания, поэтому сначала я получаю MAX (creationdate), а затем MAX (id) из этого набора, например:

SELECT  a.id,
        c.id,
        d.id,
        e.id,
        d.CREATIONDATE,
        a.REFNUMBER,
        a.DATECREATED,
        a.DESCRIPTION,
        e.CATEGORYCODE,
        e.OUTSTANDINGAM_MONAMT,
        e.PREVPAIDAMOUN_MONAMT,
        e.TOTALINCURRED_MONAMT,
        e.LOSSFROMDATE,
FROM 
TABLE_A a
INNER JOIN TABLE_B b ON (b.id = a.id)
INNER JOIN TABLE_C c ON (c.id = b.id)
INNER JOIN TABLE_D d ON
(
   c.i =
   (
      select
      d.id
      FROM TABLE_D
      WHERE TABLE_D.id = c.id
      AND TABLE_D.id =
      (
         select
         max(id)
         from TABLE_D t1
         where c_id = c.id
         and CREATIONDATE =
         (
            select
            max(CREATIONDATE)
            from TABLE_D t2
            where t2.c_id = t1.c_id
         )
      )
   ) 
)

INNER JOIN TABLE_E e ON
(
   d.i =
   (
      select
      e.d_id
      from TABLE_E
      where d_id = d.id
      AND id =
      (
         select
         max(id)
         from e t1
         where e.d_id = d.id
         and CREATIONDATE =
         (
            select
            max(CREATIONDATE)
            from TABLE_E t2
            where t2.d_id = t1.d_id
         )
      )
   )
)

Это работает, когда я вызываю его самостоятельно, но когда я добавляю его в INNER JOIN, я получаю строку для каждой соответствующей строки в таблице Y.

Что я хочу, так это последняя записьпо дате создания и id, где xid = id из TABLE_X.

Ответы [ 3 ]

2 голосов
/ 17 января 2011

Попробуйте этот запрос

select *,(
select top 1 creationdate from Table_Y 
where from Table_Y.xId = m.id
order by Table_Y.CreationDate 
) 
from Table_X m

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

1 голос
/ 17 января 2011

Это должно сделать это Сложный подзапрос определяет максимальную дату для каждой группы Y.xid, а затем дополнительно определяет максимальный Y_ID (пусть это представляет ключ в таблице Y)

SELECT X.*, Y.*
FROM TABLE_X X
INNER JOIN (
    SELECT t1.xid, Max(t1.Y_id) MaxY_id
    FROM
       (SELECT t2.xid, MAX(t2.CREATIONDATE) MDate
        FROM TABLE_Y t2
        GROUP BY t2.xid) t
    inner join TABLE_Y t1
        on t.xid=t1.xid and t.MDate = t1.CREATIONDATE) MAXY
    ON MAXY.xid = X.ID
INNER JOIN TABLE_Y Y
    ON Y.Y_ID = MAXY.MAXY_ID
0 голосов
/ 17 января 2011

"когда я добавлю это во внутреннее соединение"? какое внутреннее соединение? с каким внутренним соединением? Вопрос сильно недооценен, но я думаю, что вам это нужно (для ясности я использую только представления, вы можете просто поместить их в фигурные скобки и создать один большой запрос):

-- latest pairs of (id,creation) per xid
create view latest_id_per_xid as
   select xid,max(id) id,max(creation) creation from table_y group by xid;

-- this view leaves only the rows from table_y that have the same (id,creation,idx)
-- as the newest rows identified in the former view (it's basically a semijoin)
-- you could also join on id alone 
create view latest_whole_y as
   select table_y.* from table_y natural join latest_id_per_xid;

-- now the answer is easy:
select * from table_x join latest_whole_y

У меня нет базы данных для проверки на наличие мелких ошибок, но она должна работать нормально. (предостережение: большое предположение, что у вас никогда не будет записи с более новым идентификатором и более старой датой)

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