如何select单行加入?

How to select single row in join?

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 table 的列 ACTION_DATE 的类型为 TIMESTAMP.

我需要修改上面的查询,所以对于 LEFT OUTER JOIN MYSCHEME.IDARESULTS ON MYSCHEME.C.ID = MYSCHEME.IDARESULTS.CELLID returns 只有 1 条记录,它有最近的时间戳。我怎样才能实现它?

尝试使用以下查询

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;

使用 KEEP DENSE_RANK LAST 获取最新时间戳的 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;