SQL, чтобы получить последнюю версию модулей (max ID) из БД? - PullRequest
0 голосов
/ 01 мая 2020

Цель : я пытаюсь получить последнюю версию каждого "модуля" (например, API, Angular Site, Admin, et c) для производства и выпуска (на основном и dr-сервере). ) из базы данных, в которой есть записи для развертываний

Проблема : мой запрос, похоже, возвращает самые последние для всех, кроме одного конкретного модуля. Он возвращает последние в рабочем состоянии (версия 46.14) для всех, кроме этот один модуль (который возвращает версию 45.7)

Я занимался этим часами

Что я пробовал :

I Я пытался изменить порядок в Группе по, а также в Заказе по

Я пытался удалить элементы из группы по и по порядку по

Я пытался начать с наименьшего часть запроса и добавление по частям с нуля

Я просмотрел информацию о максимуме, группировке и порядке по

Кажется, вернется верная версия, когда я не есть поле Местоположение. Тем не менее, Location является новым необходимым полем, поэтому я не могу избавиться от этого.

Я не уверен, в каком направлении go на данный момент?

Ключ :

Env = Окружающая среда (например, Prod или Rel) Расположение (Main или DR) Ver = версия (например, 45.7 или 46.14)

Использование SQL Сервер

SQL:

select m.Name as Module, l.Name as Location, e.Name as Env, v.Name as Ver, CONVERT(NVARCHAR(16), d.OccurredOn, 120) 
from deployment d 
inner join module m on d.ModuleID = m.ID
inner join Location l on d.LocationID = l.ID 
inner join Environment e on d.EnvironmentID = e.ID
inner join versionset v on d.VersionSetID = v.ID
where d.ID in ( 
select max(d.ID) 
    from deployment d
    inner join module m on d.moduleID = m.ID
    where d.OccurredOn > '2019-01-01' and m.SuiteID = 3 and m.ID <> 12 and m.ID <> 19 AND d.EnvironmentID <> 4
    group by d.LocationID, d.EnvironmentID, d.ModuleID  
    )
    order by d.LocationID, d.EnvironmentID, d.ModuleID

1 Ответ

0 голосов
/ 01 мая 2020

Кажется, что возвращается правильная версия, когда у меня нет поля Location.

Похоже, d.LocationID это NULL для этой конкретной записи или значение, которое хранится в d.locationID не существует в Location таблице. Последнее не должно произойти, если d.LocationID является FOREIGN KEY ссылкой на Location.ID. Вместо INNER JOIN используйте LEFT JOIN в

inner join Location l on d.LocationID = l.ID

вот так

left join Location l on d.LocationID = l.ID

В этом случае l.Name в SELECT будет пустым.

Вы можете оставить d.LocationID в ORDER BY и GROUP BY.

...