C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.56145 の関連記事表示

<< 0 >>
■56145  DataTableの結合・Distinct・etc.
□投稿者/ クリッパー -(2010/12/29(Wed) 13:46:49)

    分類:[VB.NET/VB2005 以降] 

    こんにちは。
    DataSetのReadXmlを用いてXMLデータを読み込み、その中のテーブル(仮にTable1・Table2とします)を使用して処理を行います。
    各テーブルの構造は以下の通りです。
    ・Table1 ID, NAME_1, NAME_2
    ・Table2 ID, VALUE_1, VALUE_2

    1.Table1とTable2を内部結合する方法はありますか?
     例えば、Table1・Table2のID列で紐付けて、SQLでいうところの
     Table1.ID, Table1.NAME_1, Table2.VALUE_2
     を新たなDataTable等として作成する方法はありますか?

    2.Table2のIDのリストを、SQLでいうところのDISTINCTのような感じで抽出する方法はありますか?

    3.SQLでいうところの、
     SELECT NAME_1 FROM Table1 WHERE ID IN (SELECT ID FROM Table2);
     のような他テーブルの内容を使ったサブクエリ的な方法でDataTable等を作成する方法はありますか?

    使用言語はVBです。(2008)
親記事 /過去ログ94より / 関連記事表示
削除チェック/

■56146  Re[1]: DataTableの結合・Distinct・etc.
□投稿者/ やじゅ -(2010/12/29(Wed) 14:40:16)
>
    No56145 (クリッパー さん) に返信
    > 1.Table1とTable2を内部結合する方法はありますか?

    DataTable の Merge メソッドを使う。
    http://hanatyan.sakura.ne.jp/patio/read.cgi?no=174

    > 使用言語はVBです。(2008)
    VB2008ならLINQを使えばいろいろ出来そう。
記事No.56145 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56147  Re[1]: DataTableの結合・Distinct・etc.
□投稿者/ 魔界の仮面弁士 -(2010/12/29(Wed) 14:49:14)
    2010/12/29(Wed) 15:21:14 編集(投稿者)

    No56145 (クリッパー さん) に返信

    Module Module1
    Sub Main()
    Dim doc = <root>
    <Table1 ID="1" NAME_1="あああ1" NAME_2="いいい1"/>
    <Table1 ID="2" NAME_1="あああ2" NAME_2="いいい2"/>
    <Table1 ID="8" NAME_1="あああ3" NAME_2="いいい3"/>
    <Table1 ID="9" NAME_1="あああ4" NAME_2="いいい4"/>
    <Table2 ID="1" VALUE_1="ううう1" VALUE_2="えええ1"/>
    <Table2 ID="2" VALUE_1="ううう2" VALUE_2="えええ2"/>
    <Table2 ID="2" VALUE_1="ウウウ2" VALUE_2="エエエ2"/>
    <Table2 ID="5" VALUE_1="ううう3" VALUE_2="えええ3"/>
    <Table2 ID="6" VALUE_1="ううう4" VALUE_2="えええ4"/>
    </root>
    doc.Save("C:\sample.xml")

    Dim ds As New DataSet()
    ds.ReadXml("C:\sample.xml")
    Dim t1 As DataTable = ds.Tables("Table1")
    Dim t2 As DataTable = ds.Tables("Table2")

    '1.Table1とTable2を内部結合する方法はありますか?
    Console.WriteLine("Table1.ID, Table1.NAME_1, Table2.VALUE_2")
    'Dim q1 = From r1 In t1 From r2 In t2 _
    ' Where r1!ID = r2!ID _
    ' Select r1!ID, r1!NAME_1, r2!VALUE_2
    Dim q1 = From r1 In t1 _
    Join r2 In t2 _
    On r1!ID Equals r2!ID _
    Select r1!ID, r1!NAME_1, r2!VALUE_2
    For Each o In q1
    Console.WriteLine("{0}, {1}, {2}", o.ID, o.NAME_1, o.VALUE_2)
    Next
    Console.WriteLine()

    '2.Table2のIDのリストを、SQLでいうところのDISTINCTのような感じで抽出する方法はありますか?
    Console.WriteLine("Distinct of Table2")
    Dim idList = (From r2 In t2 Select r2!ID Distinct).ToList()
    idList.ForEach(AddressOf Console.WriteLine)

    '3.SQLでいうところの、
    'SELECT NAME_1 FROM Table1 WHERE ID IN (SELECT ID FROM Table2);
    'のような他テーブルの内容を使ったサブクエリ的な方法でDataTable等を作成する方法はありますか?
    Console.WriteLine()
    Dim q3 = From r1 In t1 Where idList.Contains(r1!ID) Select r1!NAME_1
    For Each o In q3
    Console.WriteLine(o)
    Next

    Console.ReadLine()
    End Sub

    End Module
記事No.56145 のレス /過去ログ94より / 関連記事表示
削除チェック/

■56148  Re[2]: DataTableの結合・Distinct・etc.
□投稿者/ 魔界の仮面弁士 -(2010/12/29(Wed) 15:15:21)
    2010/12/29(Wed) 15:16:19 編集(投稿者)

    No56147 (魔界の仮面弁士) に追記

    先ほどのは Linq による抽出。
    今回は DataView による抽出。


    Dim ds As New DataSet()
    ds.ReadXml("C:\sample.xml")
    Dim t1 As DataTable = ds.Tables("Table1")
    Dim t2 As DataTable = ds.Tables("Table2")

    '1.Table1とTable2を内部結合する方法はありますか?
    Console.WriteLine("Table1.ID, Table1.NAME_1, Table2.VALUE_2")
    ds.Relations.Add("Rel", t1.Columns("ID"), t2.Columns("ID"), False)
    Dim dv1 As New DataView(t1)
    For Each r1 As DataRowView In dv1
    For Each r2 In r1.Row.GetChildRows("Rel")
    Console.WriteLine("{0}, {1}, {2}", r1!ID, r1!NAME_1, r2!VALUE_2)
    Next
    Next
    Console.WriteLine()

    '2.Table2のIDのリストを、SQLでいうところのDISTINCTのような感じで抽出する方法はありますか?
    Console.WriteLine("Distinct of Table2")
    Dim dv2 As New DataView(t2)
    Dim tbl2 As DataTable = dv2.ToTable(True, "ID")
    For Each r2 As DataRow In tbl2.Rows
    Console.WriteLine(r2!ID)
    Next
    Console.WriteLine()

    '3.SQLでいうところの、
    'SELECT NAME_1 FROM Table1 WHERE ID IN (SELECT ID FROM Table2);
    'のような他テーブルの内容を使ったサブクエリ的な方法でDataTable等を作成する方法はありますか?
    Dim dv3 As New DataView(t1, "COUNT(Child(Rel).ID)>0", "", DataViewRowState.CurrentRows)
    Dim t3 As DataTable = dv3.ToTable("Table3", False, "NAME_1")
    For Each r3 As DataRow In t3.Rows
    Console.WriteLine(r3!NAME_1)
    Next

    Console.ReadLine()
記事No.56145 のレス /過去ログ94より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -