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

植村 友哉 uemura-t @ hikami.co.jp
2008年 3月 18日 (火) 08:34:19 JST


初めて投稿します。植村と申します。
よろしくお願いします。
まずsubjectおよび投稿するMLが適切かが疑問ですが
お許しください。

Windows2003Server上でOracle10gサーバを稼動させています。
下記のようなテーブルがあり、そのテーブルから後述の抽出条件に基づいた
特定レコードに対して処理を行うPHPスクリプトを書いています。
ただPHPもOracleも初心者で無知な為、いろいろ調べて下記のスクリプトを
書けたのですが、もっと綺麗でスマートなスクリプトは書けるものなのでしょうか。
ズバリではなくヒントだけでもいいのでご教授をお願いいたします。

PHPは別のLinuxサーバにApacheとOracleInstantをインストールして
稼動させています。
Apacheバージョン:2.0.61
PHPバージョン:5.1.6

テーブル名:受注管理
+------------------------------------------+
|受注番号|得意先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)|
+------------------------------------------+

受注番号「OD0001」、「OD0002」、「OD0007」は出荷・売上共に
完了フラグのため、抽出条件から外れます。
受注番号「OD0003」、「OD0005」は相手管理NOが重複していないため
抽出条件から外れます。
受注番号「OD0008」は、「OD0002」と相手管理NOが重複しているのですが、
「OD0002」は前述のとおり抽出条件から外れているため、「OD0008」は
相手管理NOが重複しない(抽出条件にあうレコードが1つだけ)ため
抽出条件から外れます。


==== ここからPHPスクリプト ====
01: $str = "SELECT * FROM 受注管理 WHERE 相手管理NO IN";
02: $str .= " ( SELECT 相手管理NO FROM 受注管理 GROUP BY 相手管理NO";
03: $str .= " HAVING( COUNT( 相手管理NO ) > 1 ) )";
04: $str .= " AND ( 出荷 IS NULL OR 売上 IS NULL )";
05: $str .= " ORDER BY 相手管理NO, 受注番号";
06:
07: $stmt = oci_parse( $con, $str );
08: oci_execute( $stmt );
09: while ( $row = oci_fetch_array( $stmt )) {
10:   $str = "SELECT COUNT( 相手管理NO ) AS KANRICNT FROM 受注管理";
11:   $str .= " WHERE 相手管理NO LIKE '".$row['相手管理NO'] )."%'";
12:   $str .= " AND ( 出荷 IS NULL OR 売上 IS NULL )";
13:
14:   $stmt2 = oci_parse( $con, $str );
15:   oci_execute( $stmt2 );
16:   $row2 = oci_fetch_array( $stmt2 );
17:   if( $row2['KANRICNT'] <= 1 ){
18:     continue;
19:   }
20:   // ここ以下、抽出結果に対する処理を記述
21: }
==== ここまでPHPスクリプト ====

よろしくお願いいたします。


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