在Microsoft SQL Server 2008 R2中,我尝试查询来自一个表的记录,该记录将作业步骤的开始和结束时间记录为时间戳列,这些列在错误日志表的时间戳列的30秒内。错误日志表仅将错误事件记录为标识列,并将事件的日期/时间记录为时间戳,它不包含对导致错误的事件的任何引用。
这是我写的查询(我只需要上周的记录,因此我的第一个select语句,它运行得很好):
SELECT
js.job_name, js.start_time, js.end_time
FROM
job_step AS js
WHERE
js.end_time > Dateadd(day, -8, Getdate())
AND Datediff(ss, (SELECT el.err_timestamp
FROM error_log AS el), js.end_time) < 31
直到我添加第二个选择,一切正常,但是当我添加select时,我收到此错误:
Msg 512,Level 16,State 1,Line 1
子查询返回的值超过1。当子查询遵循=,!=,&lt;,&lt; =,&gt;时,不允许这样做。 &gt;,&gt; =或当子查询用作表达式时。
注意 - 我不是开发人员,我是产品分析师,但是比许多非开发人员对sql的掌握要好于平均水平;那说,请记住在你的回复中我不是开发人员/编码员。
答案 0 :(得分:1)
您需要correlate
sub-query
,或者您应TOP 1
使用Order by
SELECT js.job_name,
js.start_time,
js.end_time
FROM job_step AS js
WHERE js.end_time > Dateadd(day, -8, Getdate())
AND Datediff(ss, (SELECT TOP 1 el.err_timestamp
FROM error_log AS el
ORDER BY some_col), js.end_time) < 31
答案 1 :(得分:0)
我会使用exists
来表示这个问题:
WHERE js.end_time > Dateadd(day, -8, Getdate()) AND
EXISTS (SELECT 1
FROM error_log el
WHERE DATEDIFF(second, el.err_timestamp, js.end_time) < 31
);
我猜你真的想要某种&#34;之间的#34;逻辑。也许:
WHERE js.end_time > Dateadd(day, -8, Getdate()) AND
EXISTS (SELECT 1
FROM error_log el
WHERE DATEDIFF(second, el.err_timestamp, js.end_time) BETWEEN -30 AND 30
);
答案 2 :(得分:0)
这将为您提供在30秒内发生错误的所有作业步骤。如果多个错误符合该条件,它可能会为每个作业步骤提供多行,但我希望您能够这样做。
SELECT
JS.job_name,
JS.start_time,
JS.end_time,
EL.event AS potential_error_in_job
FROM
dbo.Job_Step JS
INNER JOIN dbo.Error_Log EL ON
EL.err_timestamp BETWEEN DATEADD(ss, -30, JS.start_time) AND DATEADD(ss, 30, JS.end_time)