Sql 左侧联接中右侧表中的更多记录
表有一个审计表。正如您所看到的,针对表\u A\u Id有多个取消事件。我想将表\u A与Audit连接起来,以获得最高的取消日期Sql 左侧联接中右侧表中的更多记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,表有一个审计表。正如您所看到的,针对表\u A\u Id有多个取消事件。我想将表\u A与Audit连接起来,以获得最高的取消日期 Table_A Table_Audit Id Name Id Table_A_Id Event Date 1 A 1 1 Cancelled 20-01-20
Table_A Table_Audit
Id Name Id Table_A_Id Event Date
1 A 1 1 Cancelled 20-01-2014
2 B 2 1 Renewed 21-01-2014
3 1 Cancelled 22-01-2014
有人能告诉我如何修改此项以获得最高取消日期吗?我假设表A中始终存在链接到表A审计的条目,但不总是相反的方式? 在这种情况下,左连接最有可能优先于右连接 在MS-SQL中使用临时表的示例:
SELECT TA.*,A.Date FROM Table_A TA
LEFT JOIN Audit A
On TA.Id = A.Table_A_Id AND A.Event ='Cancelled'
我认为小组赛和马克斯应该玩这个把戏
declare @TABLE_A table(
ID int
, Name varchar(8)
)
INSERT INTO @TABLE_A (ID, Name)
select 1, 'A'
union all
select 2, 'B'
declare @Table_Audit table(
ID int
, Table_A_Id int
, "Event" varchar(16)
, "Date" date
)
insert into @Table_Audit (ID, Table_A_Id, "Event", "Date")
select 1, 1, 'Cancelled', '2014-01-20'
union all
select 2, 1, 'Renewed', '2014-01-21'
union all
select 3, 1, 'Cancelled', '2014-01-22'
select
a.ID
, a.Name
, ta.Date
from @TABLE_A a
left join @Table_Audit ta on ta.Table_A_Id = a.ID
where 1=1
and ta.Event = 'Cancelled'
and ta.Date = (select max(tai.Date)
from @Table_Audit tai
where tai.Event = 'Cancelled'
and tai.Table_A_Id = ta.Table_A_Id
)
试试这个。这将获得每个事件类型和表的最大ID,并显示它们的所有审核
SELECT TA.*, A.MaxDate
FROM Table_A TA
LEFT JOIN (SELECT Table_A_ID, Event, MAX(Date) MaxDate
FROM Table_Audit
WHERE Event = 'Cancelled'
GROUP BY Table_A_ID, Event) A
ON TA.Id = A.Table_A_Id
如果只想从审核表中提取最长日期,请先进行聚合,然后进行联接:
SELECT ta.*, t.Name
FROM Table_Audit ta
INNER JOIN ( SELECT Table_A_Id, Event, Max(ID) as maxId
FROM Table_Audit
GROUP BY Table_A_Id, Event
) maxAudits
ON maxAudits.maxId = ta.ID
INNER JOIN Table_A t on t.Id = ta.Table_A_Id
这能解决问题吗?好吧,试一试。你能举个例子说明结果应该是什么样子吗?这很接近,但有一个问题:结果中缺少取消日期。@daniloquio正在表_Audit表中取消日期?是的,最后一列。OP在output子句中使用此字段。在我的回答中,我将这个日期字段与MAX函数一起使用,这是有效的。@daniloquio我的英语讽刺并没有出现。。。。“ta.*”返回表中的所有字段,包括“日期”。因此,我的答案确实返回了日期。哇,我明白了。你根本没有使用表A。op将别名TA用于表_A,而您将其用于表_审核。你为什么要把表和审计本身联系起来,我不明白:复杂的答案。。。考虑到这个问题,对OP来说可能太复杂了。
SELECT TA.*, A.MAXDate
FROM Table_A TA LEFT JOIN
(SELECT A.Table_A_Id, MAX(A.DATE) as MAXDATE
FROM Audit A
WHERE A.Event = 'Cancelled'
GROUP BY A.Table_A_Id
) A
On TA.Id = A.Table_A_Id;
SELECT TOP 1 TA.*,A.Date FROM Table_A TA
INNER JOIN Audit A On TA.Id = A.Table_A_Id AND A.Event ='Cancelled' ORDER BY DATE DESC