« SQL OPEN,CLOSE | トップページ | 画面入力(単一データ入力) »

2007年5月 5日 (土)

ファイルマッチング

 二つのファイルの共通項目をキーにして新しいファイルを作成する、ファイルマッチングは事務処理ではポピュラーな処理の一つです。
処理の概要
入力する二つのファイルは共通項目を予めソートしておく。
二つのファイルをキー順に順次読込む。
キーを比較すると以下の3つの状態のいずれかになり、それぞれの処理を実行する。
 1.キーが一致したとき
   処理1:キーが両方のファイルにある。
 2.入力ファイル1のキー<入力フィアル2のキー
   処理2:キーが入力ファイル1にだけある。
 3.入力ファイル1のキー>入力フィアル2のキー
   処理3:キーが入力ファイル2にだけある。

COBOL

VB.NET
 COBOLのREAD,WRITEと同様にロジックを組むことも可能ですが、
 以下はファイルマッチングを行う時のSQL文例です。

SQLでファイルマッチングを実行
 このSQL文をVB.NETのソースに組込み3つの条件に応じた処理を行えばCOBOLのREAD,WRITEと同じ結果が得られます。
READ,WRITEではレコードを1件読む毎に処理を1回行いますがSQLではまとめて処理を行います。この例では3つの条件に応じて3回のSQL文が実行されます。

テーブルの仕様
Table_1
国コード char(3)

Table_2
国コード char(3)
国名  nchar(10)

USE TEST
-- キーが両方のテーブルにある。
SELECT T2.国コード,T2.国名
FROM         Table_1 AS T1
INNER JOIN Table_2 AS T2
ON T1.国コード = T2.国コード

-- キーがTabel_1にだけある(片方のテーブルのみにある)。
SELECT T1.国コード
FROM       Table_1 AS T1
LEFT JOIN Table_2 AS T2
ON T1.国コード = T2.国コード
WHERE T2.国コード IS NULL

-- キーがTabel_2にだけある(片方のテーブルだけにある)。
SELECT T2.国コード,T2.国名
FROM       Table_2 AS T2
LEFT JOIN Table_1 AS T1
ON T1.国コード = T2.国コード
WHERE T1.国コード IS NULL

実行例)二つのテーブルをマッチングし結果を画面に表示する。

Table_1の内容

Table_2の内容
国コード 国コード 国名
81 81 日本      
82 82 韓国      
82 84 ベトナム   
886 850 北朝鮮    
852 香港      
853 マカオ    
855 カンボジア   
856 ラオス   
86 中華人民共和国

Module Module1
    Private myCNN As SqlClient.SqlConnection
    Private myCmd As SqlClient.SqlCommand
    Private myReader As SqlClient.SqlDataReader

    Sub Main()
        Try
            Dim strCNN As String = "Data Source=localhost\SQLEXPRESS;" _
                                 & "Initial Catalog=TEST;" _
                                 & "Integrated Security=True"
            myCNN = New System.Data.SqlClient.SqlConnection(strCNN)
            myCNN.Open()

            go両方に有る()
            goファイル1だけ有る()
            goファイル2だけ有る()

            myCNN.Close()
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
    End Sub
    Private Sub go両方に有る()
        myCmd = myCNN.CreateCommand
        myCmd.CommandText _
            = "SELECT T2.国コード,T2.国名 " _
            & "FROM       Table_1 AS T1 " _
            & "INNER JOIN Table_2 AS T2 " _
            & "ON T1.国コード = T2.国コード"
        myReader = myCmd.ExecuteReader
        Console.WriteLine("両方に有る")
        Do While myReader.Read()
            Console.WriteLine(myReader.GetString(0) & " " & myReader.GetString(1))
        Loop
        myReader.Close()
    End Sub
    Private Sub goファイル1だけ有る()
        myCmd = myCNN.CreateCommand
        myCmd.CommandText _
            = "SELECT T1.国コード " _
            & "FROM       Table_1 AS T1 " _
            & "LEFT JOIN  Table_2 AS T2 " _
            & "ON T1.国コード = T2.国コード " _
            & "WHERE T2.国コード IS NULL"
        myReader = myCmd.ExecuteReader
        Console.WriteLine("ファイル1だけ有る")
        Do While myReader.Read()
            Console.WriteLine(myReader.GetString(0))
        Loop
        myReader.Close()
    End Sub
    Private Sub goファイル2だけ有る()
        myCmd = myCNN.CreateCommand
        myCmd.CommandText _
            = "SELECT T2.国コード,T2.国名 " _
            & "FROM       Table_2 AS T2 " _
            & "LEFT JOIN  Table_1 AS T1 " _
            & "ON T1.国コード = T2.国コード " _
            & "WHERE T1.国コード IS NULL"
        myReader = myCmd.ExecuteReader
        Console.WriteLine("ファイル2だけ有る")
        Do While myReader.Read()
            Console.WriteLine(myReader.GetString(0) & " " & myReader.GetString(1))
        Loop
        myReader.Close()
    End Sub

End Module

両方に有る
81  日本
82  韓国
82  韓国
ファイル1だけ有る
886
ファイル2だけ有る
84  ベトナム
850 北朝鮮
852 香港
853 マカオ
855 カンボジア
856 ラオス
86  中華人民共和国

お役に立てましたか?
IT、プログラミングのランキングサイトはこちらです。

にほんブログ村 IT技術ブログへ 人気blogランキングへ FC2 Blog Rankingへ


最新記事の自動受信登録はこちらです。

はてなRSSに追加

livedoor Readerに追加
My Yahoo!に追加
Googleに追加
goo RSSリーダーに追加

|

« SQL OPEN,CLOSE | トップページ | 画面入力(単一データ入力) »

コメント

コメントを書く



(ウェブ上には掲載しません)




« SQL OPEN,CLOSE | トップページ | 画面入力(単一データ入力) »