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

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

C# と VB.NET の入門サイト

Re[2]: DataTableの結合・Distinct・etc.


(過去ログ 94 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■56145 / inTopicNo.1)  DataTableの結合・Distinct・etc.
  
□投稿者/ クリッパー (1回)-(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)
引用返信 編集キー/
■56146 / inTopicNo.2)  Re[1]: DataTableの結合・Distinct・etc.
□投稿者/ やじゅ (1801回)-(2010/12/29(Wed) 14:40:16)
やじゅ さんの Web サイト
No56145 (クリッパー さん) に返信
> 1.Table1とTable2を内部結合する方法はありますか?

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

> 使用言語はVBです。(2008)
VB2008ならLINQを使えばいろいろ出来そう。

引用返信 編集キー/
■56147 / inTopicNo.3)  Re[1]: DataTableの結合・Distinct・etc.
□投稿者/ 魔界の仮面弁士 (2007回)-(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

引用返信 編集キー/
■56148 / inTopicNo.4)  Re[2]: DataTableの結合・Distinct・etc.
□投稿者/ 魔界の仮面弁士 (2008回)-(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()

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -