2015-09-11 32 views
0
SELECT 
    MYSCHEME.C.ID as CELLID, 
    MYSCHEME.C.NUM as CELLNUM, 
    MYSCHEME.C.UND_ID as U_ID, 
    MYSCHEME.U.SERIAL as SERIAL, 
    MYSCHEME.U.AMS_NETID as AMSID, 
    MYSCHEME.U.IP_ADDRESS as IP_ADDRESS, 
    MYSCHEME.U.MAC_ADDRESS as MAC_ADDRESS, 
    MYSCHEME.IDARESULTS.ID as IDAID 
    FROM 
    MYSCHEME.C 
    LEFT OUTER JOIN MYSCHEME.U ON MYSCHEME.C.U_ID = MYSCHEME.U.ID 
    LEFT OUTER JOIN MYSCHEME.IDARESULTS ON MYSCHEME.C.ID = MYSCHEME.IDARESULTS.CELLID 
    WHERE 
    MYSCHEME.C.SA = 1; 

這裏IDARESULTS表的列有ACTION_DATE,它的類型爲TIMESTAMP如何在連接中選擇單行?

我需要修改上面的查詢,因此LEFT OUTER JOIN MYSCHEME.IDARESULTS ON MYSCHEME.C.ID = MYSCHEME.IDARESULTS.CELLID只返回1條記錄,它有最近的時間戳。我怎樣才能實現它?

+0

爲什麼LEFT JOIN和WHERE MYSCHEME.U.ID IS NOT NULL? – jarlh

+0

您是否嘗試使用TOP 1和ORDER BY時間戳字段DESC? –

+0

@jarlh:對不起,你說得對,它沒有意義,我修正了它。 – Pablo

回答

0

使用KEEP DENSE_RANK最後獲得最新的時間戳的ID。

用一個子查詢:

select 
    c.id as cellid, 
    c.num as cellnum, 
    c.und_id as u_id, 
    u.serial as serial, 
    u.ams_netid as amsid, 
    u.ip_address as ip_address, 
    u.mac_address as mac_address, 
    (
    select max(id) keep (dense_rank last order by created_timestamp) 
    from idaresults ida 
    where ida.cellid = c.id 
    ) as idaid 
from myscheme.c 
left outer join myscheme.u on c.u_id = u.id 
where c.sa = 1; 

或者有加盟:

select 
    c.id as cellid, 
    c.num as cellnum, 
    c.und_id as u_id, 
    u.serial as serial, 
    u.ams_netid as amsid, 
    u.ip_address as ip_address, 
    u.mac_address as mac_address, 
    ida.id as idaid 
from myscheme.c 
left outer join myscheme.u on c.u_id = u.id 
left outer join 
(
    select cellid, max(id) keep (dense_rank last order by created_timestamp) as id 
    from idaresults 
    group by cellid 
) ida on ida.cellid = c.id 
where c.sa = 1; 
+0

如果我想從'idaresults'表中查詢更多列,該怎麼辦?假設我正在使用第二種方法。 – Pablo

+0

是的,您可以使用第二個查詢並將其他列添加到子查詢的選擇列表中:'max(othercolumn)keep(dense_rank last_order by created_timestamp)as othercolumn'。您不會使用第一個查詢,因爲您必須添加整個子查詢。 –

+0

兩個KEEP DENSE RANK的唯一問題是何時可以有一條平行線,即相同最近日期時間的兩條記錄。那麼可能發生的是,您從一條記錄中選擇一個值,另一條記錄則從另一個記錄中選取一個值您可以通過在order by子句中添加',rowid'來防止這種情況發生:'max(id)keep(dense_rank last_order by created_timestamp,rowid)as id'。 –

0

嘗試用下面的查詢

SELECT 
    MYSCHEME.C.ID as CELLID, 
    MYSCHEME.C.NUM as CELLNUM, 
    MYSCHEME.C.UND_ID as U_ID, 
    MYSCHEME.U.SERIAL as SERIAL, 
    MYSCHEME.U.AMS_NETID as AMSID, 
    MYSCHEME.U.IP_ADDRESS as IP_ADDRESS, 
    MYSCHEME.U.MAC_ADDRESS as MAC_ADDRESS, 
    (select top 1 MYSCHEME.IDARESULTS.ID from MYSCHEME.IDARESULTS where MYSCHEME.C.ID = MYSCHEME.IDARESULTS.CELLID) as IDAID 
    FROM 
    MYSCHEME.C 
    LEFT OUTER JOIN MYSCHEME.U ON MYSCHEME.C.U_ID = MYSCHEME.U.ID 
    WHERE 
    MYSCHEME.C.SA = 1 AND 
    MYSCHEME.U.ID IS NOT NULL;