0

私は SQL に比較的慣れていません - 先週から SQL を使い始めたばかりです。連結ベースのインデックスで2つのテーブルを結合するのに問題があります(これはできますが、いくつかの日付が表示されます)、最大日付でフィルタリングします

一緒に結合されたテーブルを示す最初のバージョンについては、以下を参照してください。参加する必要があるテーブルが 2 つあります。INVENTORY_TRANSACTION_HIST2 (ジョブ) inventory_transaction_hist (アイテムの詳細に関連する詳細)

これらのテーブル間には関連がないため、いくつかのフィールドから連結されたものを作成する必要がありました: part_no||lot_batch_no||serial_no||location_no は、2 つのテーブルを関連付けるためのものです。

order_no||release_no||sequence_no||line_item_no 2 番目のテーブルのみに関連し、日付をフィルタリングするために必要なインデックスを作成します

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)

どんな助けでも大歓迎です。

4

2 に答える 2

0

まず、コメントで述べたように、それらを連結しようとするのではなく、「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 
于 2012-07-24T20:24:58.120 に答える
0

大変お世話になりました - 本当にありがとうございました! 私が望むように動作させるために、少し微調整して管理しました。検索パフォーマンスを向上させるために変更できる点に気付いた場合は、お知らせください。

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 = '+'

ありがとうジェイミー

于 2012-07-25T17:40:50.777 に答える