Запрос на основе предложения where связанных результатов из другой таблицы - PullRequest
0 голосов
/ 11 марта 2020

У меня есть 3 таблицы в моей базе данных. Таблица A содержит основной идентификатор и название проекта. Таблица B является основной таблицей подробностей проекта, и мы записываем новую запись для каждого обновления, сделанного в нем. Таблица C предназначена для подразделений, которые могут быть добавлены в проект, и для каждой записи их может быть несколько.

Таблица A

TAID | Name
-------------
1   |  Test 1  
2   |  Test 2  
3   |  Test 3  

Таблица B

TANo   |   TAID   |   Description   |  Completed
------------------------------------------------
1      |   1      |   Some text     |  True
2      |   1      |   More text     |  True
3      |   1      |   Extra text    |  False
4      |   2      |   Other text    |  True
5      |   2      |   Test text     |  True
6      |   3      |   Text          |  True

Таблица C

DivID   |   TANo   |   TAID   |   DivisionID
------------------------------------------------
1      |   1      |    1      |   1
2      |   1      |    1      |   2
3      |   2      |    1      |   2
4      |   3      |    1      |   2
5      |   6      |    3      |   4

После чего я хочу написать запрос, который позволит мне извлечь последнюю запись идентификатора, но с разбивкой по подразделениям. Я получил свой запрос, чтобы просто получить последнюю строку из таблицы B в таблицу A, но я застрял в том, как я могу запросить свои результаты, основываясь на том, что я хочу получить все результаты для Дивизиона 1? Или несколько делений?

 Select 
 ta.Name
,tb.TANo
,tb.TAID
,tb.Description
,tb.Completed
From
TableA ta

CROSS APPLY
(
    Select
    Top(1)
     b.TANo
    ,b.TAID
    ,b.Description
    ,b.Completed
    From
    TableB as b
    Where
    b.TAID = ta.TAID 
    Order by b.TANo desc
) as tb

Так что в качестве примера у меня может быть эта запись, которая имеет несколько обновлений:

Таблица A

TAID | Name
-------------
2   |  Test 2  

Таблица B

TANo   |   TAID   |   Description   |  Completed
------------------------------------------------
4      |   2      |   Other text    |  False
5      |   2      |   Test text     |  True

Таблица C

DivID   |   TANo   |   TAID   |   DivisionID
------------------------------------------------
3      |   4      |    2      |   2
4      |   5      |    2      |   2
5      |   5      |    2      |   4

Затем с добавлением чего-либо в мой запрос, если я искал на записях, которые были в подразделениях 2 и 4, я мог отозвать результаты, где он просто показывает последнюю единственную запись проекта

Результат

TAID   |   TANo   |   Description   |   Completed
------------------------------------------------
2      |   5      |    Test text    |   True

1 Ответ

0 голосов
/ 11 марта 2020

Если вам нужна самая последняя запись в tableb для каждого подразделения, вы можете присоединиться и использовать оконные функции для фильтрации:

select *
from (
    select 
        c.divisionId, 
        b.description, 
        b.completed, 
        row_number() over(partition by c.divisionId order by tano desc) rn
    from tablec c
    inner join tableb b on b.tano = c.tano
) t
where rn = 1

Конечно, вы также можете ввести tablea:

select *
from (
    select 
        c.divisionId, 
        b.description, 
        b.completed, 
        a.name
        row_number() over(partition by c.divisionId order by tano desc) rn
    from tablec c
    inner join tableb b on b.tano = c.tano
    inner join tablea a on a.taid = b.taid
) t
where rn = 1

Примечание: неясно, почему вы храните taid в tableb и tablec; Что касается, запись в tableb принадлежит одному проекту, поэтому, по-видимому, нет необходимости хранить избыточную информацию в tablec.

...