此查询:
SELECT j.job_name, c.command, c.job_ver, j.job_ver
FROM AEDB.dbo.ujo_command_job as c
INNER JOIN AEDB.dbo.ujo_job as j
ON c.joid = j.joid
WHERE command LIKE '%$$XI1134%'
返回以下示例行:
XI113TEST4-J 'echo $$XI1134*-NXT-BUS-6D-MMdDDdYYYY' 6 1
XI113TEST4-J 'echo $$XI1134*-NXT-BUS-6D-MMdDDdYYYY' 6 2
XI113TEST4-J 'echo $$XI1134*-NXT-BUS-6D-MMdDDdYYYY' 6 3
XI113TEST4-J 'echo $$XI1134*-NXT-BUS-6D-MMdDDdYYYY' 6 4
XI113TEST4-J 'echo $$XI1134*-NXT-BUS-6D-MMdDDdYYYY' 6 5
XI113TEST4-J 'echo $$XI1134*-NXT-BUS-6D-MMdDDdYYYY' 6 6
XI113TEST4-J 'echo $$XI1134*-NXT-BUS-6D-MMdDDdYYYY' 6 7
XI113TEST4-J-1 'echo $$XI1134*-NXT-BUS-6D-YYJJJ' 2 1
XI113TEST4-J-1 'echo $$XI1134*-NXT-BUS-6D-YYJJJ' 2 2
XI113TEST4-J-1 'echo $$XI1134*-NXT-BUS-6D-YYJJJ' 2 3
XI113TEST4-J-2 'echo $$XI1134*-NXT-BUS-7D-TO-MMdDDdYYYY' 2 1
XI113TEST4-J-2 'echo $$XI1134*-NXT-BUS-7D-TO-MMdDDdYYYY' 2 2
XI113TEST4-J-2 'echo $$XI1134*-NXT-BUS-7D-TO-MMdDDdYYYY' 2 3
XI113TEST4-J-3 'echo $$XI1134*-NXT-BUS-7D-TO-YYJJJ' 3 1
XI113TEST4-J-3 'echo $$XI1134*-NXT-BUS-7D-TO-YYJJJ' 3 2
XI113TEST4-J-3 'echo $$XI1134*-NXT-BUS-7D-TO-YYJJJ' 3 3
我怎样才能最好地修改查询,以使任何给定作业名称的j.job_ver(列4)的最大值必须匹配c.job_ver(列3)。仅上述示例中的最后一行。
数据库保留作业版本,我不希望返回旧版本的信息。
答案 0 :(得分:1)
如果我理解正确,则只需要对max()进行“分组依据”:
SELECT j.job_name, c.command, c.job_ver, max(j.job_ver)
FROM AEDB.dbo.ujo_command_job as c
INNER JOIN AEDB.dbo.ujo_job as j
ON c.joid = j.joid
WHERE command LIKE '%$$XI1134%'
group by j.job_name, c.command, c.job_ver
如果这对您不起作用,您能否解释“仅应生成上述示例中的最后一行”?
仅返回每个类别的最后一行?
另一个问题是:“ col4必须匹配col3”是什么意思?
col4 = col3或col4> = col3
更新: 在上述查询中添加一个子查询:
SELECT a.job_name, a.command, a.job_ver, a.current_ver
from (
SELECT j.job_name, c.command, c.job_ver, max(j.job_ver) as current_ver
FROM AEDB.dbo.ujo_command_job as c
INNER JOIN AEDB.dbo.ujo_job as j
ON c.joid = j.joid
WHERE command LIKE '%$$XI1134%'
group by j.job_name, c.command, c.job_ver )a
where a.job_ver = a.current_ver
答案 1 :(得分:1)
有两种方法可以执行此操作。由于只需要最大ujo_job.job_ver
的记录,因此可以在CTE中计算该记录,也可以在子查询中进行记录。根据您的数据,一个可能比另一个性能更高。您必须进行测试。
有关我使用的设置,请参阅我的小提琴( db <>提琴here )。如果您的数据看起来完全不同,请告诉我,我会再尝试一次。
CTE版本:
; WITH maxJobs AS ( SELECT j.joid, j.job_name, max(j.job_ver) as job_ver FROM ujo_job j GROUP BY j.joid, j.job_name ) SELECT j2.job_name, c.command, c.job_ver, j2.job_ver FROM ujo_command_job c INNER JOIN maxJobs j2 ON c.joid = j2.joid AND c.job_ver = j2.job_ver WHERE c.command LIKE '%$$XI1134%'
job_name | command | job_ver | job_ver :------------- | :--------------------------------- | ------: | ------: XI113TEST4-J-3 | echo $$XI1134*-NXT-BUS-7D-TO-YYJJJ | 3 | 3
子查询版本:
SELECT s1.job_name, c.command, c.job_ver, s1.job_ver FROM ujo_command_job c INNER JOIN ( SELECT j.joid, j.job_name, max(j.job_ver) as job_ver FROM ujo_job j GROUP BY j.joid, j.job_name ) s1 ON c.joid = s1.joid AND c.job_ver = s1.job_ver WHERE c.command LIKE '%$$XI1134%'
job_name | command | job_ver | job_ver :------------- | :--------------------------------- | ------: | ------: XI113TEST4-J-3 | echo $$XI1134*-NXT-BUS-7D-TO-YYJJJ | 3 | 3
我还更改了您的 WHERE
子句,使其在第一位之后执行LIKE
,而不是在开始时使用通配符。如果您所有的command
都以"echo..."
开头,请执行此操作以使其处理更快。如果他们可以以其他方式开头,请将通配符%
保留在查询中。
编辑:由于新的OP注释,它们可能在搜索字符串之前有任何文本,因此我在词的两端都切换回了通配符搜索。这将进行更多处理,因此,如果前导文本是恒定的,则不使用前导通配符。
答案 2 :(得分:0)
您只需要将该条件放入JOIN c.job_ver = j.job_ver
因此,您的查询将如下所示:
SELECT
j.job_name
, c.command
, c.job_ver
, j.job_ver
FROM
AEDB.dbo.ujo_command_job as c
INNER JOIN AEDB.dbo.ujo_job as j
ON c.joid = j.joid AND c.job_ver = j.job_ver
WHERE
command LIKE '%$$XI1134%'