2011-01-17 5 views
7

Ich möchte die erste Zeile nur aus einer inneren Verbindung zurückgeben. Ich habe zwei Tabellen:Need eine Zeile nur von INNER JOIN zurückgegeben

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 

Zeilen in der Tabelle Y gleich Schöpfung haben Daten so bin ich zum ersten Mal des MAX bekommen (creation) und dann anschließend MAX (id) aus diesem Satz, zum Beispiel:

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

Dies funktioniert, wenn ich es auf seine eigene nennen, aber wenn ich es zu einem inneren hinzufügen JOIN ich eine Zeile für jede passende Zeile in der Tabelle Y. bekommen

Was ich will, ist die letzte Platte von creation und id wo xid = ID aus TABELLE_X.

+0

Können Sie uns Ihren Versuch der inneren Verbindung zeigen? –

+0

Was Marcelo sagte. Das Problem liegt wahrscheinlich im JOIN selbst. Nimmst du zum Beispiel an ID oder MAX (ID) teil? –

+1

Die MAX (ID) - ist die ID-Spalte von X oder Y? –

Antwort

0

"wenn ich es zu einem inneren Join hinzufüge"? Welche innere Verbindung? mit welcher inneren Verbindung? Die Frage ist schlecht underspecified, aber ich glaube, Sie brauchen diese (ich nur Ansichten klar sein, können Sie es ganz einfach nur in Klammern setzen und eine große Abfrage erstellen):

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

ich keine Datenbank zur Hand haben nach kleinen Fehlern suchen, aber es sollte gut laufen. (Einschränkung: die große Annahme ist, dass man nie einen Datensatz mit einem neueren id und älterem Datum hat)

1

Dies sollte es tun Die komplexe Unterabfrage funktioniert für jede Y.xid Gruppe des max Datum aus, und von dem, arbeitet weiter den Max Y_ID aus (lassen Sie diese den Schlüssel auf dem Tisch Y repräsentieren)

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

diese Abfrage

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

die Sub-Abfrage das Top-1 Ergebnis holen wird, die max creation und die Hauptabfrage hat wird alle Datensätze s auswählen o Sie haben Ihr gewünschtes Ergebnis

+0

Dies funktioniert nicht in Oracle, da Oracle nicht TOP hat und Platzhalter die Tabelle angeben müssen, wenn zusätzliche Spalten vorhanden sind. – Allan