2011-01-17 32 views
7

Tôi muốn trả lại hàng đầu tiên chỉ từ một kết nối bên trong. Tôi có hai bảng:Chỉ cần một hàng được trả về từ 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 

hàng trong bảng Y có thể có tạo giống hệt ngày vì vậy tôi đầu tiên nhận được MAX (creationdate) và sau đó thì MAX (id) từ bộ này, ví dụ:

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

Điều này hoạt động khi tôi gọi nó là của riêng nó nhưng khi tôi thêm nó vào INNER JOIN Tôi đang nhận được một hàng cho mỗi hàng phù hợp trong bảng Y.

Điều tôi muốn là kỷ lục mới nhất của creationdate và id trong đó xid = id từ TABLE_X.

+0

Bạn có thể cho chúng tôi thấy nỗ lực của bạn ở bên trong không? –

+0

Những gì Marcelo nói. Vấn đề có thể nằm trong JOIN, chính nó. Bạn đang tham gia vào id hoặc MAX (id), ví dụ? –

+1

MAX (id) - là cột id từ X hoặc Y? –

Trả lời

0

"khi tôi thêm nó vào kết nối bên trong"? những gì bên trong tham gia? với những gì bên trong tham gia? Câu hỏi đặt ra là nặng underspecified, nhưng tôi nghĩ rằng bạn cần điều này (tôi chỉ sử dụng quan điểm phải rõ ràng, bạn có thể dễ dàng chỉ cần đặt chúng trong niềng răng và xây dựng một truy vấn lớn):

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

Tôi không có cơ sở dữ liệu trong tầm tay để kiểm tra những sai lầm nhỏ, nhưng nó sẽ chạy tốt. (lưu ý: giả định lớn là bạn không bao giờ có bản ghi có id mới hơn và ngày cũ hơn)

1

Điều này sẽ làm điều đó Truy vấn con phức tạp sẽ tính ngày tối đa cho mỗi nhóm Y.xid và từ đó, tiếp tục hoạt động ra Max Y_ID (để điều này đại diện cho phím trên bàn 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

hãy thử truy vấn này

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

truy vấn phụ sẽ chọn top 1 kết quả có creationdate max và truy vấn chính sẽ chọn tất cả các bản ghi o bạn có kết quả mong muốn của bạn

+0

Điều này sẽ không hoạt động trong Oracle, vì Oracle không có 'TOP' và ký tự đại diện phải có bảng được chỉ định nếu có thêm cột. – Allan

Các vấn đề liên quan