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

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

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

Re[5]: 主キーの無いMDBテーブル間で非共通レコード


(過去ログ 114 を表示中)

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

■67463 / inTopicNo.1)  主キーの無いMDBテーブル間で非共通レコードを抽出
  
□投稿者/ パル (5回)-(2013/08/05(Mon) 10:22:39)

分類:[C#] 

VS2010 C#

お世話になります。
主キーが存在しない2つのMDBファイル間で、非共通データの抽出を行い、
同一構造をもつテーブルに出力したいです。

以下のようなクエリを作成してアクセスで試してみました。

SELECT tb1.ID, tb1.数値, tb1.テキスト
FROM tb1 LEFT JOIN tb2 ON (tb1.ID = tb2.ID) AND (tb1.数値 = tb2.数値) AND (tb1.テキスト = tb2.テキスト)
WHERE (tb2.ID) Is Null AND (tb2.数値) Is Null AND (tb2.テキスト) Is Null;

※IDは主キーではありません。

上記の場合、tb1とtb2間で、すべてのフィールドが同じデータのレコードでも、いずれかのフィールドにnull値を含む場合にはデータが抽出されてしまいます。

クエリだけでは解決できそうにないかと思い、ロジックで解決できないかと思ってこちらのほうに掲示させていただきました。

よい方法はないでしょうか。

よろしくお願いします。
引用返信 編集キー/
■67464 / inTopicNo.2)  Re[1]: 主キーの無いMDBテーブル間で非共通レコードを抽出
□投稿者/ shu (360回)-(2013/08/05(Mon) 12:01:25)
No67463 (パル さん) に返信

SELECT tb1.ID, tb1.数値, tb1.テキスト
FROM tb1 INNER JOIN tb2 ON (tb1.ID = tb2.ID) AND (tb1.数値 = tb2.数値) AND (tb1.テキスト = tb2.テキスト)

をクエリ1として定義して

Select 〜
From tbl1 left join クエリ1 on 〜
Where 〜
union
Select 〜
From tbl2 left join クエリ1 on 〜
Where 〜

でどうでしょう?
引用返信 編集キー/
■67465 / inTopicNo.3)  Re[2]: 主キーの無いMDBテーブル間で非共通レコード
□投稿者/ パル (6回)-(2013/08/05(Mon) 12:49:18)
2013/08/05(Mon) 12:56:07 編集(投稿者)

shu様
お世話になります。
ご回答、ありがとうございます。

ひとまず、unionの前までで、以下のようにクエリを組みましたが、
アドバイスの意図とあっていますでしょうか?

※Q1クエリ
SELECT tb1.ID, tb1.数値, tb1.テキスト
FROM tb1 INNER JOIN tb2 ON (tb1.テキスト = tb2.テキスト) AND (tb1.数値 = tb2.数値) AND (tb1.ID = tb2.ID);

このクエリでは、NULL値を含むフィールドがある場合、そのレコードは抽出されません。

そのため、以下のクエリを実行した場合

SELECT tb1.ID, tb1.数値, tb1.テキスト
FROM tb1 LEFT JOIN Q1 ON (tb1.テキスト = Q1.テキスト) AND (tb1.数値 = Q1.数値) AND (tb1.ID = Q1.ID)
WHERE (((Q1.ID) Is Null) AND ((Q1.数値) Is Null) AND ((Q1.テキスト) Is Null));

すべてのフィールド内容が同じであっても、null値を含むフィールドがある場合は、そのレコードも抽出されます。

たとえば、

 ID=1,数値=2,テキスト=null

というレコードが両方のテーブルに含まれると、
これが抽出されてしまいます。

SQLの意図が違っているようでしたら、ご教示いただければありがたいです。
よろしくお願いします。

引用返信 編集キー/
■67469 / inTopicNo.4)  Re[3]: 主キーの無いMDBテーブル間で非共通レコード
□投稿者/ shu (361回)-(2013/08/05(Mon) 13:28:08)
No67465 (パル さん) に返信

> すべてのフィールド内容が同じであっても、null値を含むフィールドがある場合は、そのレコードも抽出されます。
>
null あるとやはりだめですね。

joinしないで

From tb1, tb2
Where ((tb1.ID is Null and tb2.ID is null) or (tb1.ID = tb2.ID)) And ・・・

のようにWhere句による結合を行うのはどうでしょう?From句のJoinしないテーブル列挙がこれで
よかったか定かではないのでクエリデザイナでつくると良いかもしれません。
引用返信 編集キー/
■67471 / inTopicNo.5)  Re[4]: 主キーの無いMDBテーブル間で非共通レコード
□投稿者/ パル (7回)-(2013/08/05(Mon) 14:16:11)
shu様
お世話になります。

SELECT TB1.ID, TB1.数値, TB1.テキスト
FROM TB1,TB2
WHERE
(([TB1].[ID] = [TB2].[ID]) or ( [TB1].[ID] is null and [TB2].[ID] is null))
AND
(( [TB1].[数値] = [TB2].[数値] ) or ( [TB1].[数値] is null and [TB2].[数値] is null))
AND
(( [TB1].[テキスト] = [TB2].[テキスト] ) or ( [TB1].[テキスト] is null and [TB2].[テキスト] is null ))

上記でNULL値を含むレコードも含めて、同一レコードをすべて抽出できました。

とすると・・・共通しないレコードは抽出されなかったレコードということになりますが、SQLで抽出できないでしょうか。やはり、全体レコード(TB1の全レコード)から共通レコードを逐一削除していくというような方法しかないでしょうか。

以上、よろしくお願いします。
引用返信 編集キー/
■67472 / inTopicNo.6)  Re[5]: 主キーの無いMDBテーブル間で非共通レコード
□投稿者/ パル (9回)-(2013/08/05(Mon) 15:13:56)
2013/08/05(Mon) 15:14:18 編集(投稿者)

自己解決できました。

where not exists
上記を使用して目的のレコードを取得できました。

クエリだけで実現できたんですね。

どうもありがとうございました。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -