Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 左侧联接中右侧表中的更多记录_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 左侧联接中右侧表中的更多记录

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

表有一个审计表。正如您所看到的,针对表\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-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