ВЫБЕРИТЕ элементы, которые были недавно изменены

#sql #select #sql-subselect

#sql #выберите #sql-дополнительный выбор

Вопрос:

Я хочу выбрать номера элементов, которые были недавно изменены на основе метки времени, а затем использовать эти номера элементов для выбора / поиска элементов с bin=MASTER . Ниже то, что я пробовал:

 SELECT  (SELECT cItemno FROM TB_BinLoc WHERE Updates > {ts '2020-12-17 05:00:00'} ) as x , cBin
FROM TB_BinLoc y
WHERE y.cItemno = x AND cBin = 'MASTER'
 

===============
Вот что у меня получилось:

 SELECT cItemno, cWarehouse, cBin, nCounted, Updates FROM TB_BinLoc WHERE Updates > {ts '2020-12-17 05:00:00'}
UNION
SELECT DISTINCT y.cItemno, y.cWarehouse, y.cBin, y.nCounted, y.Updates
FROM TB_BinLoc y
JOIN TB_BinLoc x on y.cItemno = x.cItemno
Where y.cBin = 'MASTER' AND y.cWarehouse = 'MAIN'
AND x.Updates > {ts '2020-12-17 05:00:00'}
ORDER BY cBin ASC
 

Ответ №1:

Используйте join следующим образом:

 SELECT distinct x.cItemno as x , y.cBin
  FROM TB_BinLoc y
  Join TB_BinLoc x on y.cItemno = x.cItemno
 Where y.cBin = 'MASTER'
   And x.Updates > {ts '2020-12-17 05:00:00'}
 

Комментарии:

1. Большое вам спасибо!

2. Если это сработало для вас, пожалуйста, примите ответ, чтобы этот вопрос был отмечен как решенный

Ответ №2:

Это может быть хорошим местом для использования оконных функций:

 SELECT bl.*
FROM (SELECT bl.*, MAX(updates) OVER (PARTITION BY cItemNo) as max_update
      FROM TB_BinLoc bl
     ) bl
WHERE bl.cItemno = x AND blcBin = 'MASTER' AND
      bl.max_update > {ts '2020-12-17 05:00:00'}
 

Комментарии:

1. @BachPhi . , , я понятия не имею, что вы имеете в виду под этим. Эта логика исходит из запроса в вопросе (тип был update , а не updates ).

2. @BachPhi . , , Ваш комментарий не имеет смысла. Я скажу, что оконные функции обычно имеют лучшую производительность, чем самосоединения.

3. @BachPhi . , , Оба эти выражения взяты из вашего вопроса.