如何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;
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;