質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

36802閲覧

【VB.NET】DataTableを結合する

programer

総合スコア31

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/02/10 05:14

お世話になっております。
現在、VB.NETでの開発を行っています。
その中で、二つのDataTableがあり、SQLでいうところのLEFT JOINのようなことをDataTableで行えないかと思っています。

「AAA」
No. Name Remark

1 ○○○
2 ××× ---
3 △△△

「BBB」
No. Group

1 赤
2 青
3 黄

「NewTable」
No. Name Remark Group

1 ○○○ 赤
2 ××× --- 青
3 △△△ 黄

上記のようにある項目に紐づけて二つのDataTableを一つにしたいです。
分かる方いらっしゃいましたら教えてください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

確認できていないけど、こんな感じで

Dim ds As New DataSet ds.Tables.Add(AAA) ds.Tables.Add(BBB) ds.Relations.Add("NewTable", AAA.Columns("No"), BBB.Columns("No"))

-追記-
ただ結果のDataTableが欲しいだけなら
前提が

Dim AAA As New DataTable Dim BBB As New DataTable Dim newtable As New DataTable AAA.Columns.Add("No") AAA.Columns.Add("Value") AAA.Rows.Add(1, "a") AAA.Rows.Add(2, "b") AAA.Rows.Add(3, "c") BBB.Columns.Add("No") BBB.Columns.Add("Value") BBB.Rows.Add(1, "A") BBB.Rows.Add(2, "B") BBB.Rows.Add(3, "C") newtable.Columns.Add("No") newtable.Columns.Add("Value1") newtable.Columns.Add("Value2")

みたいなのだと思いますが

Dim joinresult = AAA.AsEnumerable.Select(Function(x) New With { .No = x.Item("No"), .Value1 = x.Item("Value"), .Value2 = BBB.AsEnumerable.Where(Function(y) y.Item("No") = x.Item("No")).FirstOrDefault?.Item("Value") }) For Each item In joinresult.ToList newtable.Rows.Add(item.No, item.Value1, item.Value2) Next

みたいにしてもいいかもしれません

投稿2017/02/10 05:41

編集2017/02/10 22:18
dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

programer

2017/02/10 05:45

回答ありがとうございます。 関連付けたものをDatatableにしたいのですが、ここからどのようにすればいいのでしょうか。 AddされたDatasetをDatatableに変換すればいいのでしょうか。
programer

2017/02/10 06:05

Dim newTable As DataTable = ds.Tables(0)のようにしてみましたが、やり方が悪かったのか、うまく結合されていませんでした。この記事をもう少し読み込んでみます。
guest

0

ベストアンサー

多分、もっといい方法があると思うのですが、別の質問のほうも考慮してサンプルを・・・

VB

1 Private Sub Test() 2 Dim ds As New DataSet 3 Dim dt1 As New DataTable 4 Dim dt2 As New DataTable 5 Dim newtable As New DataTable 6 7 dt1.Columns.Add("No") 8 dt1.Columns.Add("T1C1") 9 dt1.Columns.Add("T1C2") 10 dt1.Columns.Add("T1C3") 11 dt1.Columns.Add("T1C4") 12 dt1.Columns.Add("T2No") 13 14 dt2.Columns.Add("No") 15 dt2.Columns.Add("T2C1") 16 dt2.Columns.Add("T2C2") 17 dt2.Columns.Add("T2C3") 18 dt2.Columns.Add("T2C4") 19 20 For i = 0 To 100 21 dt1.Rows.Add(i, String.Format("C1-{0}", i), String.Format("C2-{0}", i), String.Format("C3-{0}", i), String.Format("C4-{0}", i), i + 1000) 22 dt2.Rows.Add(i + 1000, String.Format("T2C1-{0}", i), String.Format("T2C2-{0}", i), String.Format("T2C3-{0}", i), String.Format("T2C4-{0}", i)) 23 Next 24 25 ds.Tables.Add(dt1) 26 ds.Tables.Add(dt2) 27 ds.Relations.Add("Test", dt2.Columns("No"), dt1.Columns("T2No")) 28 29 '結合結果のDataTableを作成 30 newtable.Columns.Add("No") 31 newtable.Columns.Add("T1C1") 32 newtable.Columns.Add("T2C3") 33 34 For Each r As DataRow In dt1.Rows 35 Dim t2r As DataRow = r.GetParentRow("Test") 36 newtable.Rows.Add(r.Item("No"), r.Item("T1C1"), t2r.Item("T2C3")) 37 Next 38 39 '結果を出力 40 For Each r As DataRow In newtable.Rows 41 Console.WriteLine(String.Join(",", r.ItemArray)) 42 Next 43 44 End Sub

投稿2017/02/10 07:10

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

programer

2017/02/13 00:20

別の質問も考慮していただき、ありがとうございます。 行をループさせてやるやり方が結局は一番単純でいいのかもしれませんね。
guest

0

二つのDataTableがあり、SQLでいうところのLEFT JOINのようなことを

その「二つのDataTable」をどのように作成したのですか?

もし、SQL Server などの DB から ADO.NET の DataAdapter などを使用して生成したものであれば、DB から直接「SQLでいうところのLEFT JOINのようなことを」して取得してはいかがですか?

投稿2017/02/10 06:22

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

programer

2017/02/10 06:29

そのSQLが複雑で重いため、データグリッドのDatasouseから列で取得したいと思っています。
退会済みユーザー

退会済みユーザー

2017/02/10 07:09

「データグリッドのDatasouse」というのが「二つのDataTable」と理解していますが、それから取得しようとすると、自分が考え付くのは、AsEnumerable メソッドで IEnumerable<DataRow> オブジェクトを取得し、LINQ で join して・・・ということですが、それはさらに複雑で重くなると思うのですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問