要按最大日期筛选的基于连接连接的索引的SQL子查询

要按最大日期筛选的基于连接连接的索引的SQL子查询,sql,oracle,Sql,Oracle,我对SQL相对来说比较陌生,只是在上周才开始使用它。通过基于串联的索引(我可以这样做,但它显示了几个日期)将两个表连接在一起,然后按最大日期过滤,我遇到了一些问题 请参阅下面的第一个版本,该版本显示了连接在一起的表。 有两个表需要连接。 库存\事务\历史记录2(作业) 库存\交易\历史(与项目细节相关的更多详细信息) 这些表之间没有关联,因此我不得不从多个字段构建串联的表: 零件号|批次号|序列号|位置号 用于两个表之间的关联 order|u no | release|u no | sequen

我对SQL相对来说比较陌生,只是在上周才开始使用它。通过基于串联的索引(我可以这样做,但它显示了几个日期)将两个表连接在一起,然后按最大日期过滤,我遇到了一些问题

请参阅下面的第一个版本,该版本显示了连接在一起的表。 有两个表需要连接。 库存\事务\历史记录2(作业) 库存\交易\历史(与项目细节相关的更多详细信息)

这些表之间没有关联,因此我不得不从多个字段构建串联的表:
零件号|批次号|序列号|位置号
用于两个表之间的关联

order|u no | release|u no | sequence|u no | line|u item_no
仅与第二个表相关,并创建筛选日期所需的索引

select
to_char(job.dated,'dd/mm/yyyy hh:mm:ss') date_issued,
job.userid,
job.part_no,
job.quantity,
job.lot_batch_no,
job.serial_no,
job.cost,
job.quantity* job.cost total_cost,
job.source note,
hist.dated,
hist.order_no,
hist.release_no,
hist.sequence_no,
hist.line_item_no

from
inventory_transaction_job job
left join inventory_transaction_hist hist
on job.part_no||job.lot_batch_no||job.serial_no||job.location_no = hist.part_no||hist.lot_batch_no||hist.serial_no||hist.location_no
where (job.source like UPPER('%'||'&Job_No'||'%') or job.source like LOWER('%'||'&Job_No'||'%'))
and hist.transaction LIKE '%INM-IN%'
and hist.direction LIKE '+'
order by job.part_no
我需要按历史上的最新日期进一步拆分。表(由于一些批次/序列号仅显示为“*”,因此可以针对每个批次/序列号显示多个订单号-我只想显示这些批次/序列号的最新订单)

我已经尝试了下面的和其他一些变化,但我似乎无法让它工作

select
to_char(job.dated,'dd/mm/yyyy hh:mm:ss') date_issued,
job.userid user_id,
job.part_no,
job.quantity,
job.lot_batch_no,
job.serial_no,
job.cost,
job.quantity* job.cost total_cost,
job.source note,
hist.dated,
hist.order_no,
hist.release_no,
hist.sequence_no,
hist.line_item_no

from
inventory_transaction_job job
left join inventory_transaction_hist hist
on job.part_no||job.lot_batch_no||job.serial_no||job.location_no = hist.part_no||hist.lot_batch_no||hist.serial_no||hist.location_no
where (job.source like UPPER('%'||'&Job_No'||'%') or job.source like LOWER('%'||'&Job_No'||'%'))
and hist.transaction LIKE '%INM-IN%'
and hist.direction LIKE '+'
and job.order_no||job.sequence_no||job.line_item_no IN
(SELECT
hist2.order_no||hist2.sequence_no||hist2.line_item_no
FROM inventory_transaction_hist hist2
WHERE job.part_no||job.lot_batch_no||job.serial_no||job.location_no LIKE hist2.part_no||hist2.lot_batch_no||hist2.serial_no||hist2.location_no
ORDER BY hist2.Dated DESC LIMIT 1)

任何帮助都将不胜感激。

按照您的查询逻辑进行操作有点困难。但是欢迎来到StackOverflow。你应该用你正在使用的数据库来标记你的问题,我猜是Oracle

首先,如注释中所述,您应该对由“AND”连接的各个列进行连接,而不是尝试将它们连接在一起。连接是聪明的,但它使查询优化器更难完成它的工作,例如

我的想法是,您需要不同组的历史记录表中的最新日期。我使用分析函数计算最大日期,然后将其用于比较

最终查询如下所示:

 select to_char(job.dated,'dd/mm/yyyy hh:mm:ss') date_issued, job.userid user_id, job.part_no,
        job.quantity, job.lot_batch_no, job.serial_no, job.cost, job.quantity* job.cost total_cost,
        job.source note, hist.dated,  hist.order_no, hist.release_no, hist.sequence_no, hist.line_item_no
from inventory_transaction_job job left join
     (select hist.*,
             MAX(dated) over (PARTITION by hist2.part_no, hist2.lot_batch_no, hist2.serial_no, hist2.location_no) as maxdated
      from inventory_transaction_hist hist
     ) hist
     on job.part_no = hist.part_no and
        job.lot_batch_no = hist.lot_batch_no and
        job.serial_no = hist.serial_no and
        job.location_no = hist.location_no join
     (SELECT hist2.order_no, hist2.lot_batch_no, hist2.serial_no, hist2.location_no, hist2.sequence_no, hist2.line_item_no
      FROM inventory_transaction_hist hist2
      ORDER BY hist2.Dated DESC
      LIMIT 1
     )
where (job.source like UPPER('%'||'&Job_No'||'%') or job.source like LOWER('%'||'&Job_No'||'%')) and
      hist.transaction LIKE '%INM-IN%' and
      hist.direction LIKE '+' and
      hist.dated = hist.maxdated 

我不是100%确定,但是,这是你需要的。也许它会对你有所帮助。

非常感谢你的帮助-非常感谢! 经过一点调整,使其按我所希望的方式工作。 如果您注意到任何可以更改以提高搜索性能的内容,请告诉我

select
to_char(job.dated,'dd/mm/yyyy hh:mm:ss') date_issued,
job.userid user_id,
job.part_no,
job.quantity,
job.lot_batch_no,
job.serial_no,
job.cost,
job.quantity* job.cost total_cost,
job.source note,
to_char(hist.dated,'dd/mm/yyyy hh:mm:ss') date_PO_received,
hist.order_no,
hist.release_no,
hist.sequence_no,
hist.line_item_no

from
INVENTORY_TRANSACTION_job job
left join (select hist.*, MAX(hist.dated) over (PARTITION by hist.transaction, hist.direction, hist.part_no, hist.serial_no, hist.lot_batch_no order by hist.dated desc) as maxdated
from inventory_transaction_hist hist
) hist
on
job.part_no = hist.part_no and
job.lot_batch_no = hist.lot_batch_no and
job.serial_no = hist.serial_no and
hist.dated = hist.maxdated
where (job.source like UPPER('%'||'&Job_No'||'%') or job.source like LOWER('%'||'&Job_No'||'%'))
and hist.transaction LIKE '%INM-IN%'
and hist.direction = '+'
再次感谢
Jamie

您不需要将字符串串联在一起进行联接-您可以使用
通过多列联接表。例如,
JOIN hist ON(job.part_no=hist.part_no和job…
等。我认为我们可能需要查看一些示例数据和输出。是的,使用逻辑比较,而不是串联-这取决于您的数据类型,甚至不安全。此外,将
job.source
的内容转换为大写或小写,并删除其中一个函数。您需要也可能最好返回
job.dated
job.occurrent
可能是更好的名称)作为时间戳,用于显示软件处理。只有一个字符的
LIKE
子句等同于使用
=
,您的意思是添加通配符吗?感谢您的输入!现在您提到不要以这种方式使用串联是很有意义的!这是一个好主意,它更适合于将日期视为偶然事件。哦,是的,我只是想使用=not LIKEWow,非常感谢您的快速回复!我仍在思考一些SQL函数,但从您编写的内容来看,它是有意义的,正是我想要的!我明天尝试此功能时会给您更新。再次感谢