繁体   English   中英

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

[英]I need assistance with a SQL sub-query

该查询:

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()进行“分组”:

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

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

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

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

子查询版本:

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

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

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

您只需要将该条件放入您的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%'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM