[PHP-users 33397] Re: 重複レコードを抽出するスクリプトについて(DB:Oracle)

ml @ colosuke.net ml @ colosuke.net
2008年 3月 18日 (火) 17:59:56 JST


うえだです。

SQL一発で必要なデータが取得できるのではないでしょうか。

SELECT tbl1.受注番号, tbl1.得意先CD, tbl1.相手管理NO,tbl1.出荷,tbl1.売上
FROM 受注管理 AS tbl1
JOIN (
  SELECT 相手管理NO, COUNT(*) AS c FROM 受注管理 
  WHERE 出荷 IS NULL OR 売上 IS NULL
  GROUP BY 相手管理NO
  HAVING c >= 2
) AS tbl2 ON (tbl1.相手管理NO = tbl2.相手管理NO)
ORDER BY tbl1.相手管理NO, tbl1.受注番号


テストしてませんが、ニュアンスだけでも伝われば。
サブクエリーが早いか、スクリプト側で処理するのが早いかはデータ件数やデー
タベースサーバの性能にもよるでしょうから、そのあたりは実際にテストして試
すしかないでしょう。

以上です。

> テーブル名:受注管理
> +------------------------------------------+
> |受注番号|得意先CD|相手管理NO| 出荷 | 売上 |
> +------------------------------------------+
> | OD0001 | TCD001 | 0001-A01 | 完了 | 完了 |
> | OD0002 | TCD002 | AAAA-001 | 完了 | 完了 |
> | OD0003 | TCD003 | 0803-001 |(NULL)|(NULL)|
> | OD0004 | TCD001 | 0001-A02 | 完了 |(NULL)|
> | OD0005 | TCD003 | 0803-002 | 完了 |(NULL)|
> | OD0006 | TCD002 | AAAA-002 | 完了 |(NULL)|
> | OD0007 | TCD001 | 0001-A01 | 完了 | 完了 |
> | OD0008 | TCD002 | AAAA-001 | 完了 |(NULL)|
> | OD0009 | TCD002 | AAAA-A02 | 完了 |(NULL)|
> | OD0010 | TCD001 | 0001-A02 |(NULL)|(NULL)|
> +------------------------------------------+
> ※受注番号はユニークな値です
> 
> 抽出条件
> ・出荷または売上が(NULL)で相手管理NOが重複しているレコード
> ・抽出結果は相手管理NO,受注番号毎でソートする
> 希望する抽出結果
> +------------------------------------------+
> |受注番号|得意先CD|相手管理NO| 出荷 | 売上 |
> +------------------------------------------+
> | OD0004 | TCD001 | 0001-A02 | 完了 |(NULL)|
> | OD0010 | TCD001 | 0001-A02 |(NULL)|(NULL)|
> | OD0006 | TCD002 | AAAA-002 | 完了 |(NULL)|
> | OD0009 | TCD002 | AAAA-A02 | 完了 |(NULL)|
> +------------------------------------------+




PHP-users メーリングリストの案内