2016-03-13 27 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

相关问题