我需要有关SQL子查询的帮助

埃弗隆·克拉克(Ephron Clarke)

该查询:

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)。仅上述示例中的最后一行。

该数据库保留作业版本,并且我不希望返回旧版本的信息。

肖恩

您可以通过两种方法来执行此操作。由于只需要具有max的记录,因此ujo_job.job_ver可以在CTE中计算该记录,也可以在子查询中进行记录。根据您的数据,一个可能比另一个性能更高。您必须进行测试。

请参阅我的小提琴以获取我使用的设置(db <> fiddle此处)。如果您的数据看起来完全不同,请告诉我,我会再尝试一次。

此版本:

; 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 | 命令 job_ver | job_ver 
:------------- | :--------------------------------- | ------:| ------:
XI113TEST4-J-3 | 回声$$ 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 | 命令 job_ver | job_ver 
:------------- | :--------------------------------- | ------:| ------:
XI113TEST4-J-3 | 回声$$ XI1134 * -NXT-BUS-7D-TO-YYJJJ | 3 | 3

我还更改了您的 WHERE 子句,使其 LIKE 在第一位之后执行,而不是在开始时使用通配符。如果您所有的都以 command 开头 "echo..." ,则可以这样做,以使其处理更快。如果他们可以以其他方式开头,请 % 在查询中保留通配符

编辑:由于新的OP注释,它们在搜索字符串之前可能有任何文本,因此我在该词的两端都切换回了通配符搜索。这将进行更多处理,因此,如果前导文本是恒定的,则不使用前导通配符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章