我想仅从内连接返回第一行。我有两张桌子:
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
表Y中的行可以具有相同的创建日期,因此我首先获得MAX(creationdate),然后从该集合获得MAX(id),例如:
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
)
)
)
)
当我自己调用它时,这是有效的,但当我将它添加到INNER JOIN时,我为表Y中的每个匹配行获取一行。
我想要的是creationdate和id的最新记录,其中xid =来自TABLE_X的id。
答案 0 :(得分:2)
尝试此查询
select *,(
select top 1 creationdate from Table_Y
where from Table_Y.xId = m.id
order by Table_Y.CreationDate
)
from Table_X m
子查询将选择具有max creationdate的前1个结果,主查询将选择所有记录,以便获得所需的结果
答案 1 :(得分:1)
这应该这样做 复杂子查询计算出每个Y.xid组的最大日期,并从中进一步计算出最大Y_ID(让它代表表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 :(得分:0)
“当我将其添加到内连接时”?什么内心的加入?什么内联?问题严重不足,但我认为你需要这个(我只使用视图清楚,你可以轻松地将它们放在括号中并构建一个大查询):
-- 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
我手边没有数据库来检查小错误,但它应该运行正常。 (警告:最大的假设是你从来没有一个新的id和更旧的日期记录)