2016-10-03 6 views
1

SQL文をマテリアライズド・ビューとして実行し、後でテーブルをより大きなテーブルに結合しようとしています。私は大きなテーブルの項目/場所のコンボに関する重複する制約に違反する問題が発生しています。ここに私のマテリアライズド・ビュークエリです:私は一人でネストされたクエリを実行すると重複を返すSQLクエリ

SELECT /*+ materialize */ CAN.CNCL_CNT, CAN.ITEM, CAN.LOCATION, 
     CAN.LAST_CNCL_DTE, OL.CANCEL_ID 
FROM ORDLOC OL, 
    (SELECT COUNT(CANCEL_DATE) AS CNCL_CNT, ITEM, LOCATION, 
      MAX(CANCEL_DATE) AS LAST_CNCL_DTE 
     FROM ORDLOC 
     WHERE CANCEL_DATE between (to_date(20160123,'yyyymmdd') -60) and to_date(20160123,'yyyymmdd') 
     AND CANCEL_DATE IS NOT NULL 
     GROUP BY ITEM, LOCATION) CAN 
WHERE CAN.ITEM = OL.ITEM 
AND CAN.LOCATION = OL.LOCATION 
AND CAN.LAST_CNCL_DTE = OL.CANCEL_DATE 
GROUP BY CAN.CNCL_CNT, CAN.ITEM, CAN.LOCATION, CAN.LAST_CNCL_DTE, OL.CANCEL_ID 

今、私は数百行以下を持っている、といくつか存在します全体クエリを実行するときにアイテム/場所コンボは、しかし、すべて一意です重複したアイテム/ロケーションで100行以上が返されました。

+2

ITEMとLOCATIONはCANサブクエリ内で一意になりますが、ORDLOCテーブル/ビューはどうでしょうか?また、マテリアライズ・ヒントを使用しただけでは、マテリアライズド・ビューにはなりません。これはOracleでは非常に異なるものです。また、マテリアライズヒントはドキュメント化されていないため、バグ(このヒントで見たことがある)と異なるバージョン間で予期しない変更を行う機能が用意されていない限り、実動コードで使用しないでください。 – Boneist

+0

ご意見ありがとうございます。マテリアライズド・ヒントを使用して、一時表をマテリアライズしました。それが何らかの有効性を持っているかどうかはわかりませんが、私は同じエフェクトへのヒントなしに試してみたと思います。 – Adil

+0

オーソロックテーブルに関しては、ユニークなアイテム/ロケーションは保持していませんが、ユニークな「オーダーノー」を保持しています。理想的には、最新のキャンセル日のみを受け取りたいのです。 – Adil

答えて

0

解決策は、重複する項目/位置を排除するためにCANCEL_IDに最大限の機能を使用することでした。同じITEM、LOCATION、LAST_CNCL_DATEではなく、2つの異なるCANCEL_IDによって稀なシナリオがあるためです。ここに私が使用したコードがありました。

SELECT CAN.CNCL_CNT, CAN.ITEM, CAN.LOCATION, 
CAN.LAST_CNCL_DTE, MAX (OL.CANCEL_ID) AS CANCEL_ID 
FROM ORDLOC OL, 
    (SELECT COUNT(CANCEL_DATE) AS CNCL_CNT, ITEM, LOCATION, 
    MAX(CANCEL_DATE) AS LAST_CNCL_DTE 
    FROM ORDLOC 
    WHERE CANCEL_DATE BETWEEN (TO_DATE(20160123,'yyyymmdd') -60) AND TO_DATE(20160123,'yyyymmdd') 
    GROUP BY ITEM, LOCATION) CAN 
WHERE CAN.ITEM = OL.ITEM 
AND CAN.LOCATION = OL.LOCATION 
AND CAN.LAST_CNCL_DTE = OL.CANCEL_DATE 
GROUP BY CAN.CNCL_CNT, CAN.ITEM, CAN.LOCATION, CAN.LAST_CNCL_DTE 
関連する問題