Как получить максимальную запись из внутреннего объединенного поля, SQL? - PullRequest
0 голосов
/ 24 июня 2019

Мне нужно извлечь MAX seendate из подзапроса, на который он похож, и я могу сделать это для конкретного Предмета, но как только я уберу предложение WHERE для конкретного Предмета, он ничего не отображает, см. Ниже:

  SELECT Item.Barcode,
  Hetype.Description,
  StockTakeDetails.SeenDate,
  Users.UserName,
  defcon.Defcon_text,
  JOBS.Job_Ref,
  JOBS."Due Back"
FROM Item
  INNER JOIN Hetype ON Item.Type = Hetype.Type
  INNER JOIN StockTakeDetails ON Item.Itemref = StockTakeDetails.xItemID
  INNER JOIN Users ON Users.UID = StockTakeDetails.xUserSeen
  INNER JOIN EQLISTS ON Item.CurrentJob = EQLISTS.Eql_no
  INNER JOIN JOBS ON EQLISTS.Job_no = JOBS.JobNo
  INNER JOIN defcon ON JOBS.Status = defcon.Defcon_idx
WHERE JOBS."Due Back" >= TIMESTAMP '2019-01-01 00:00:00' AND
  JOBS.Status <> 5 AND
  Item.Barcode = '038223' AND
  StockTakeDetails.IDX = (SELECT Max(StockTakeDetails.IDX)
  FROM StockTakeDetails INNER JOIN Item ON StockTakeDetails.xItemID =
      Item.Itemref WHERE Item.Barcode = '038223')

Это работает нормально, но если я уберу предложение Barcode, оно не покажет никаких данных:

SELECT Item.Barcode,
  Hetype.Description,
  StockTakeDetails.SeenDate,
  Users.UserName,
  defcon.Defcon_text,
  JOBS.Job_Ref,
  JOBS."Due Back"
FROM Item
  INNER JOIN Hetype ON Item.Type = Hetype.Type
  INNER JOIN StockTakeDetails ON Item.Itemref = StockTakeDetails.xItemID
  INNER JOIN Users ON Users.UID = StockTakeDetails.xUserSeen
  INNER JOIN EQLISTS ON Item.CurrentJob = EQLISTS.Eql_no
  INNER JOIN JOBS ON EQLISTS.Job_no = JOBS.JobNo
  INNER JOIN defcon ON JOBS.Status = defcon.Defcon_idx
WHERE JOBS."Due Back" >= TIMESTAMP '2019-01-01 00:00:00' AND
  JOBS.Status <> 5 AND
  StockTakeDetails.IDX = (SELECT Max(StockTakeDetails.IDX)
  FROM StockTakeDetails INNER JOIN Item ON StockTakeDetails.xItemID =
      Item.Itemref)

Пожалуйста, дайте мне знать, как еще я могу это сделать.

Спасибо

Ответы [ 4 ]

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

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

SELECT i1.Barcode,
  Max(StockTakeDetails.SeenDate),
  Hetype.Description
FROM Item i1
  INNER JOIN Hetype ON i1.Type = Hetype.Type
  LEFT JOIN StockTakeDetails ON i1.Itemref = StockTakeDetails.xItemID
  INNER JOIN Users ON Users.UID = StockTakeDetails.xUserSeen
  INNER JOIN EQLISTS ON i1.CurrentJob = EQLISTS.Eql_no
  INNER JOIN JOBS ON EQLISTS.Job_no = JOBS.JobNo
  INNER JOIN defcon ON JOBS.Status = defcon.Defcon_idx
WHERE JOBS."Due Back" >= TIMESTAMP '2019-01-01 00:00:00' AND
  JOBS.Status <> 5
GROUP BY i1.Barcode,
  JOBS."Due Back",
  JOBS.Status,
  Hetype.Description    
1 голос
/ 24 июня 2019

Нужно ли вам просто и максимальное количество показов StockDetails?

SELECT 
   Item.Barcode
   ,max(StockTakeDetails.IDX) as max_idx
FROM StockTakeDetails 
INNER JOIN Item 
   ON StockTakeDetails.xItemID = Item.Itemref 
GROUP BY Item.Barcode

Вместо использования этого запроса в качестве фильтра с одним значением в вашем WHERE, вы можете присоединиться к этому подзапросу в обоихШтрих-код и max_idx.

В качестве альтернативы вы можете изменить основной запрос, чтобы он группировался по соответствующим уникальным полям, и взять max(StockTakeDetails.SeenDate)

1 голос
/ 24 июня 2019

Скорее всего, вам нужно ограничить штрих-код в подзапросе.Обратите внимание на псевдонимы, всегда используйте псевдонимы таблиц, чтобы избежать путаницы

  SELECT i1.Barcode,
  Hetype.Description,
  StockTakeDetails.SeenDate,
  Users.UserName,
  defcon.Defcon_text,
  JOBS.Job_Ref,
  JOBS."Due Back"
FROM Item i1
  INNER JOIN Hetype ON i1.Type = Hetype.Type
  INNER JOIN StockTakeDetails ON i1.Itemref = StockTakeDetails.xItemID
  INNER JOIN Users ON Users.UID = StockTakeDetails.xUserSeen
  INNER JOIN EQLISTS ON i1.CurrentJob = EQLISTS.Eql_no
  INNER JOIN JOBS ON EQLISTS.Job_no = JOBS.JobNo
  INNER JOIN defcon ON JOBS.Status = defcon.Defcon_idx
WHERE JOBS."Due Back" >= TIMESTAMP '2019-01-01 00:00:00' AND
  JOBS.Status <> 5 AND
  StockTakeDetails.IDX = (SELECT Max(s.IDX)
                          FROM StockTakeDetails s 
                          INNER JOIN Item i2 ON s.xItemID = i2.Itemref 
                          WHERE i2.Barcode = i1.Barcode)
1 голос
/ 24 июня 2019

Думаю, вам нужно GROUP BY Item.Barcode в конце подзапроса, где вы заменили определенный код товара. Когда вы вынули его, вы передаете одно значение обратно для всей таблицы вместо одной максимальной детализации для каждого штрих-кода.

...