有没有一种优雅的方法来用SQL编写特定的查询?

时间:2019-11-07 08:57:15

标签: sql postgresql

enter image description here我有三个表:INVENTORY,TRANSFER,INVENTORY_TRANSFER。

传输可以具有三种状态:接受,等待,拒绝。

如果转移状态为“已接受”或“已拒绝”,则可以再次转移库存。这意味着我们可以在TRANSFER中创建新行。和 在INVENTORY_TRANSFER中创建原始文件,并在其中分配库存ID和转让ID

因此,我需要获取未转移的所有库存,或者该库存的最后一次转移(具有最大id的inventory_transfer)的状态为“已接受”或“已拒绝”。

如果未转移库存,则意味着stock_transfer中没有包含特定库存和转移的记录

所以,我知道我需要做

SELECT * FROM INVENTORY i 
LEFT JOIN INVENTORY_TRANSFER it on i.inventory_id = it.invetory_id
LEFT JOIN TRANSFER t on it.transfer_id = t.transfer_id
WHERE ???

是否有一种优雅的方式来获取库存,而最后一次库存转移不具有“待处理”状态。

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则可以使用distinct on找到最后的转帐记录,然后查找是否符合您的条件:

select i.*
from inventory i left join
     (select distinct on (it.inventory_id) it.inventory_id, t.status
      from inventory_transfer it join
           transfer t
           on it.transfer_id = t.transfer_id
      order by it.inventory_id, it.created_datetime desc
     ) it
     on it.inventory_id = i.inventory_id
where it.inventory_id is null or  -- no transfers 
      it.status in ('ACCEPTED', 'DECLINED');

这使用创建的时间戳来确定“最后”记录。您的问题尚不清楚是应该是创建的时间戳还是更新的时间戳。