Мне нужна помощь с подзапросом SQL - PullRequest
1 голос
/ 16 апреля 2019

Этот запрос:

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). Результатом должна быть только последняя строка в приведенном выше примере.

В базе данных хранятся версии заданий, и я не хочу, чтобы информация из более старых версий возвращалась.

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

Есть несколько способов сделать это.Поскольку вам нужны только записи с максимальным значением ujo_job.job_ver, вы можете либо рассчитать эту запись в CTE, либо сделать это в подзапросе.В зависимости от ваших данных, один может быть более производительным, чем другой.Вам придется проверить.

См. Мой Fiddle для настройки, которую я использовал ( 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%'
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, они могут иметь любой текстперед строкой поиска, поэтому я переключился на поиск с подстановочными знаками на обоих концах термина.Это потребует дополнительной обработки, поэтому, если начальный текст постоянен, оставьте его без начального подстановочного знака.

1 голос
/ 16 апреля 2019

Если я правильно понимаю, вам нужно только 'group by' с 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
0 голосов
/ 16 апреля 2019

вам нужно только поместить это условие в ваш 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%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...