SQL Server - Как получить последнее обновление каждой группы из нескольких таблиц - PullRequest
0 голосов
/ 14 июня 2019

Например, у меня есть 3 таблицы:

tbl_main
-------------------------
|ID_No |Info1   |Info2  |
|------+--------+-------|
|00123 |name1   |a city |
|00567 |name2   |b city |
|00789 |name3   |c city |
-------------------------

tbl_version
--------------------------------
|ID_No |Version_Name|Version_No|
|------+------------+----------|
|00123 |version_a_01|1         |
|00567 |version_b_01|1         |
|00789 |version_c_01|1         |
--------------------------------

tbl_version_upd
--------------------------------
|ID_No |Version_Name|Version_No|
|------+------------+----------|
|00123 |version_a_02|2         |
|00123 |version_a_03|2         |
|00123 |version_a_04|4         |
|00789 |version_c_02|2         |
--------------------------------

Я хочу получить последнее Version_Name каждого ID_No на основе Version_No из tbl_version и tbl_version_upd вместе.

Wanted output:
--------------------------------------
|ID_No |Info1   |Info2  |Version_Name|
|------+--------+-------+------------|
|00123 |name1   |a city |version_a_04|
|00567 |name2   |b city |version_b_01|
|00789 |name3   |c city |version_c_02|
--------------------------------------

В настоящее время,У меня есть этот запрос:

Select a.ID_No, a.Info1, a.Info2, b.Version_Name
FROM tbl_main a
LEFT JOIN (tbl_version UNION ALL tbl_version_upd) b ON a.ID_No=b.ID_No

Но он получает все версии каждого ID_No

Current output:
--------------------------------------
|ID_No |Info1   |Info2  |Version_Name|
|------+--------+-------+------------|
|00123 |name1   |a city |version_a_01|
|00123 |name1   |a city |version_a_02|
|00123 |name1   |a city |version_a_03|
|00123 |name1   |a city |version_a_04|
|00567 |name2   |b city |version_b_01|
|00789 |name3   |c city |version_c_01|
|00789 |name3   |c city |version_c_02|
--------------------------------------

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Применение - хороший способ получить его, я также использовал CTE для объединения, но только для удобства чтения подзапрос также работает

;WITH allversions AS (
    SELECT ID_No, Version_Name, Version_No
    FROM tbl_version
    UNION ALL 
    SELECT ID_No, Version_Name, Version_No
    FROM tbl_version_upd
)
SELECT a.ID_No, a.Info1, a.Info2, b.Version_Name
FROM tbl_main a
OUTER APPLY (
    SELECT TOP 1 Version_Name 
    FROM allversions av
    WHERE av.ID_No = a.ID_No
    ORDER BY Version_No DESC
) b
0 голосов
/ 14 июня 2019

Вы можете попробовать ниже, используя коррелированный подзапрос

Select a.ID_No, a.Info1, a.Info2, b.Version_Name
FROM tbl_main a
LEFT JOIN (tbl_version UNION ALL tbl_version_upd) b ON a.ID_No=b.ID_No
where version_no in 
      (select max(version_no) from (tbl_version UNION ALL tbl_version_upd) b1 
           where b.ID_No=b1.ID_No)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...