2014-04-29 66 views
1
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 

表中有一個審計表。正如你所看到的,針對Table_A_Id有多個Cancel事件。我想通過審計加入Table_A以獲取最高取消日期。左側加入右側表中的更多記錄

SELECT TA.*,A.Date FROM Table_A TA 
    LEFT JOIN Audit A 
    On TA.Id = A.Table_A_Id AND A.Event ='Cancelled' 

任何人都可以建議我如何可以修改以獲得最高的取消日期

+0

也許是對加入? –

+0

這會解決他的問題嗎? – InTheWorldOfCodingApplications

+0

好吧,試試看看 –

回答

0

我假設總是存在於表-A項,這兩個掛Table_Audit,但並不總是其他方式周圍? 在這種情況下,左連接最可能偏好右連接。

使用MS-SQL的臨時表的一個例子:

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 
) 
+1

複雜的答案......對於給定問題的OP可能太複雜。 – sarin

0

我覺得GROUP BY和MAX應該做的伎倆。

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 
0

試試這個。這將爲您獲取每個事件類型和表的最大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 
+0

這非常接近,但有一個問題:結果中取消日期不存在。 – daniloquio

+0

@daniloquio在Table_Audit表中取消日期? – sarin

+0

是的,最後一欄。 OP在輸出子句中使用此字段。在我的答案中,我使用MAX函數的這個日期字段,並且工作。 – daniloquio

1

如果你只想從審計表拉動最大日起,首先做的聚集,然後加入:

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; 
0
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