试图简化单个表的查询

问题描述 投票:0回答:1

我有一个来自SQLAnywhere(Netbackup)的表,我试图以一种可以帮助Shell脚本确定是否需要重新运行的方式来查询,而我们不需要。 Netbackup自然会尝试重新运行该作业,因此它可能会失败几次,然后在12小时窗口内成功运行。我正在呼叫的是domain_job,我试图在12小时内查询特定的状态码(4275),只要在12小时内有3个状态码,而没有0返回码。我需要它来列出此输出,以便脚本可以运行它。我尝试了嵌套选择,但计数似乎有误。

此选择返回数据,但我无法弄清楚如何最好地插入状态码的数量,以确保自0以来3次备份均失败,并显示最新的作业ID,因此可以由Shell脚本重新运行。也不确定计数是否正确返回。

SELECT a.clientName, a.job_count, MAX(id)
FROM (SELECT clientName, COUNT(statusCode) AS job_count
FROM domain_job
 where statusCode = 4275
  AND type = 28
  AND (policyName LIKE '%vip%' OR policyName LIKE '%VIP%')
  AND datediff(HOUR, UTCBigIntToNOMTime(endTime), getdate()) < 12
GROUP BY clientName
ORDER BY clientName, job_count DESC ) a, domain_job b
 where a.clientName=b.clientName
  AND b.statusCode = 4275
  AND b.type = 28
  AND (b.policyName LIKE '%vip%' OR b.policyName LIKE '%VIP%')
  AND datediff(HOUR, UTCBigIntToNOMTime(b.endTime), getdate()) < 12
GROUP BY client_name 

此选择有效,但似乎令人费解。

SELECT COUNT(*) AS "Failures",
       d.clientName AS "Client"
FROM domain_Job d
WHERE clientName IN (
    SELECT clientName
    FROM domain_Job c
    WHERE c.id IN (
        -- Get the Max Job ID with out filtering for Status Code.
        -- This will then be used to get the final result of backups
        -- We will see if backups have reran successfully or not.
        SELECT MAX(b.id)
        FROM domain_job b
        WHERE b.clientName IN (
            -- Get the initial client names of backups that have failed in
            -- XX hours ago with 4275, this is the seed.
            SELECT a.clientName
            FROM domain_job a
            WHERE a.statusCode = 4275
              AND a.type = 28
              AND (a.policyName LIKE '%vip%' OR a.policyName LIKE '%VIP%')
              AND datediff(HOUR, UTCBigIntToNOMTime(a.endTime), getdate()) < 12
            GROUP BY a.clientName
            )
          AND b.type = 28
          AND (b.policyName LIKE '%vip%' OR b.policyName LIKE '%VIP%')
          AND datediff(HOUR, UTCBigIntToNOMTime(b.endTime), getdate()) < 12
        GROUP BY b.clientName
        )
      AND c.statusCode = 4275
      AND c.type = 28
      AND (c.policyName LIKE '%vip%' OR c.policyName LIKE '%VIP%')
      AND datediff(HOUR , UTCBigIntToNOMTime(c.endTime), getdate()) < 12
    )
  AND datediff(HOUR , UTCBigIntToNOMTime(d.endTime), getdate()) < 12
GROUP BY "Client"  ```


sql inner-join sqlanywhere
1个回答
0
投票

尝试从查询a中删除“ ORDER BY clientName,job_count DESC”

© www.soinside.com 2019 - 2024. All rights reserved.