2011-01-17 2 views
7

Я хотел бы вернуть первую строку только из внутреннего соединения. У меня есть две таблицы:Нужно, чтобы одна строка возвращалась только из INNER JOIN

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.

То, что я хочу, это последняя запись по CreationDate и ид, где XID = id из TABLE_X.

+0

Можете ли вы показать нам свою попытку внутреннего соединения? –

+0

Что сказал Марсело. Проблема, вероятно, заключается в самом JOIN. Например, присоединяетесь ли вы к id или MAX (id)? –

+1

MAX (id) - это столбец идентификатора от X или Y? –

ответ

0

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

-- 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 

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

1

Это должно сделать это комплекс подзапрос работает дату макс для каждой группы 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 
2

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

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 результат, которые имеют максимальную CreationDate и основной запрос выберет все записи s o у вас есть желаемый результат

+0

Это не будет работать в Oracle, так как Oracle не имеет «TOP», а подстановочные знаки должны иметь указанную таблицу, если есть дополнительные столбцы. – Allan

Смежные вопросы