2016-03-13 56 views
1
Table: 
    Logs 
Fields:  
    LogDate datetime, 
    ErrId int 

錯誤9和5有時發生在同一日期。 我如何找到這些日期? 當然的任務可以對任何對ErrIds的不只是9和5SQL:獲取具有兩個特定事件的日期

我結束了以下SQL語句:

select distinct l_1.LogDate 
from logs l_1 
where exists (select * from logs l_2 where l_1.LogDate = l_2.LogDate and l_2.ErrId = 9) 
    and exists (select * from logs l_3 where l_1.LogDate = l_3.LogDate and l_3.ErrId = 5) 

的問題:是有任務的更好的解決方案?

+0

它是什麼類型的數據庫? – kometen

+0

@kometen:SQL Server – DmitryRibak

+0

謝謝。我已經添加了sql-server標籤並正在等待同行評審。 PLS。用DB的類型標記任何未來的問題以及更通用的SQL。 – kometen

回答

1

你可以使用一個自連接是這樣的:

select  distinct l_1.LogDate 
from  logs l_1 
inner join logs l_2 on l_1.LogDate = l_2.LogDate 
where  l_1.ErrId = 9 
and  l_2.ErrId = 5 

注意,通常最好是使用group by而不是distinct。試試看:

select  l_1.LogDate 
from  logs l_1 
inner join logs l_2 on l_1.LogDate = l_2.LogDate 
where  l_1.ErrId = 9 
and  l_2.ErrId = 5 
group by l_1.LogDate 
+0

非常感謝!這麼簡單:) – DmitryRibak

1

也許最簡單的方法是簡單地group byhaving

select l.LogDate 
from logs l 
group by l.log_date 
having sum(case when l.ErrId = 9 then 1 else 0 end) > 0 and 
     sum(case when l.ErrId = 5 then 1 else 0 end) > 0; 

如果你只是在尋找一個固定的值,你也可以寫爲:

select l.LogDate 
from logs l 
where l.ErrId in (5, 9) 
group by l.log_date 
having count(distinct l.ErrId) = 2; 

這兩個應該比用加入一起做group by/distinct更快。

+0

太棒了!謝謝,戈登! – DmitryRibak

相關問題