2011-01-17 16 views
7

Chciałbym zwrócić pierwszy wiersz tylko z połączenia wewnętrznego. Mam dwie tabele:Potrzebuję tylko jednego wiersza zwróconego przez 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 

wierszy w tabeli Y mogą mieć daty identyczne tworzenie więc jestem pierwszy uzyskanie MAX (sporządzenia), a następnie następnie MAX (ID) z tego zestawu, na przykład:

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

to działa, gdy zgłoszę go na jego własne, ale kiedy dodać go do INNER JOIN otrzymuję wiersz dla każdego wiersza dopasowania w tabeli Y.

Co chcę to najnowszy rekord przez CreationDate i id gdzie XID = id z TABLE_X.

+0

Czy możesz pokazać nam swoją próbę połączenia wewnętrznego? –

+0

Co powiedział Marcelo. Problem prawdopodobnie leży w samym JOIN. Czy dołączasz na przykład do id lub MAX (id)? –

+1

MAX (id) - jest kolumną identyfikatora z X lub Y? –

Odpowiedz

0

"kiedy dodaję to do połączenia wewnętrznego"? co łączy się wewnętrznie? z jakim połączeniem wewnętrznym? Pytanie jest źle underspecified, ale myślę, że trzeba to (ja używam tylko widoki być jasne, można łatwo wystarczy umieścić je w nawiasach i budować jeden wielki zapytanie):

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

nie mam bazę danych pod ręką sprawdź małe błędy, ale powinno działać poprawnie. (uwaga: głównym założeniem jest to, że nigdy nie masz rekordu z nowszym identyfikatorem i starszą datą)

1

To powinno zrobić to Złożone podzapytanie określa maksymalną datę dla każdej grupy Y.xid, a z tego, dalsze prace na zewnątrz Max Y_ID (niech to stanowią klucz na stole 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

Spróbuj zapytanie

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

zapytanie sub odbierze góra 1 wyniki, które mają max CreationDate i głównego zapytania wybierze wszystkie rekordy o masz pożądany wynik

+0

To nie zadziała w Oracle, ponieważ Oracle nie ma 'TOP', a symbole wieloznaczne muszą mieć określoną tabelę, jeśli są dodatkowe kolumny. – Allan