Ограничение записей в соединении один ко многим - PullRequest
1 голос
/ 06 апреля 2019

Я пытаюсь сгенерировать список записей, в которых заголовок содержит одну запись, а ПЕРВАЯ запись в журнале обозначает дату создания записи.Все остальные подробные записи не нужны и создают несколько результатов, когда мне нужно только первое.

Я пробовал «группировать по», самостоятельные объединения, отдельные и т. Д., Но пока ничего из того, что я сделал, не дало желаемого эффекта.Я чувствую, что упускаю что-то действительно очевидное.

Вот с чем я работаю:

SELECT i.id
    ,l.CreateDate
    ,i.departmentname
    ,i.productkey
    ,c.Description
FROM dbo.table i (NOLOCK)

JOIN dbo.log l ON i.id = l.id

JOIN dbo.LU_Table c ON i.id = c.ID

WHERE l.CreateDate > '2019-04-01'

AND l.CreateDate < '2019-04-30'

Я бы хотел увидеть:

ID# 1, 04/05/2019, Department, Product, Description
ID# 2, 04/05/2019, Department, Product, Description
ID# 3, 04/05/2019, Department, Product, Description
ID# 4, 04/05/2019, Department, Product, Description

Вместо этого я получаю:

ID# 1, 04/05/2019, Department, Product, Description
ID# 1, 04/06/2019, Department, Product, Description
ID# 1, 04/07/2019, Department, Product, Description
ID# 1, 04/08/2019, Department, Product, Description
ID# 1, 04/09/2019, Department, Product, Description
ID# 2, 04/05/2019, Department, Product, Description
ID# 2, 04/06/2019, Department, Product, Description
ID# 2, 04/07/2019, Department, Product, Description
ID# 2, 04/08/2019, Department, Product, Description
ID# 2, 04/09/2019, Department, Product, Description

Ответы [ 3 ]

0 голосов
/ 06 апреля 2019

Казалось бы, вы хотите:

SELECT i.id, l.CreateDate, i.departmentname, i.productkey, c.Description
FROM dbo.table i JOIN
     (SELECT l.id, MIN(l.CreateDate) as CreateDate
      FROM dbo.log l
      GROUP BY l.id
     ) l
     ON i.id = l.id JOIN
     dbo.LU_Table c
     ON i.id = c.ID
WHERE l.CreateDate > '2019-04-01' AND
      l.CreateDate < '2019-04-30';
0 голосов
/ 06 апреля 2019

Что я понял из запроса, так это то, что есть таблица имен таблиц, в которой у меня есть одна запись для идентификатора, и в таблице журнала может быть несколько записей для каждого идентификатора.

Этого можно добиться, создав производную таблицу для таблицы журнала.

Производная таблица

Select  row_number() over(partition by ID order by ID) srno     
          , ID 
          , creation_date
   From log

Попробуйте это

SELECT i.id
    ,l.CreateDate
    ,i.departmentname
    ,i.productkey
    ,c.Description
FROM dbo.table i (NOLOCK)
JOIN (Select  row_number() over(partition by ID order by ID) srno       
              , ID 
              , creation_date
       From log ) l  on l.id = i.id and  l.srno = 1

JOIN dbo.LU_Table c ON i.id = c.ID
WHERE l.CreateDate > '2019-04-01'

AND l.CreateDate < '2019-04-30'
0 голосов
/ 06 апреля 2019

Я думаю, что проще всего было бы поместить Order By после пункта where. так что это будет выглядеть как ORDER BY l.CreateDate, i.id ASC, и это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...