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

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

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

Re[7]: SQLで違うテーブル同士での値を比較したい


(過去ログ 89 を表示中)

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

■52744 / inTopicNo.1)  SQLで違うテーブル同士での値を比較したい
  
□投稿者/ ぼりびあん (1回)-(2010/08/23(Mon) 22:09:36)

分類:[データベース全般] 

大変お世話様です。以後、よろしくお頼み申し上げます。
ウインドオズ2003R2のORACLE10G環境です。

SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。
<Aテーブル>
A1	A2	A3	A4	A5
------- ------- ------- ------- ----------
XXXXXXX XX1     ABC     3       2009/05/08
WWCWWCW WW2     CCB     1       2008/03/21
DDDDDDD DD1     JPN     5       2007/08/08
GGGGGGG GX9     SOX     2       1977/01/04
FFFFFFF USJ     NPB     3       2001/09/11


<Bテーブル>
B1	B2	B3	B4	B5
------- ------- ------- ------- ----------
XXXXXXX XX1     ibicha  oshimu  2002/07/05
XXXXXXX XX1     takeshi okada   2005/07/15
XXXXXXX XX1     kamo    shu     1857/09/25
WWCWWCW WW2     wao     wao     2008/10/22
DDDDDDD DD1	ui	hhh	2006/06/30
DDDDDDD DD1	jojoj   x5xx    1999/09/09
DDDDDDD DD1	momo    hara    2005/03/07
DDDDDDD DD1	itai    u-      2003/12/22
DDDDDDD DD1	komano  goal    2007/04/26
GGGGGGG GX9     dame    record  2009/11/14
FFFFFFF USJ     iki     tai     1995/08/15
FFFFFFF USJ     sstebu  spi     2004/01/05
FFFFFFF USJ     bb      pp      2009/08/23

A1とB1は主キー、A2とB2は副キーです。
Aテーブルの「A4」カラムにはBテーブルのレコード数を持っています。(主キー、副キーが同じものの)
しかし、よくよく見るとAテーブルの「GGGGGGG」のA4には「2」のはずなのにBテーブルには実際にレコードは1つしかありません。
こういう状態になってしまっているのを割り出したいのですがどのようにA4とBテーブルで数があってないものを抽出できるでしょうか。
よろしくお願いいたします。

引用返信 編集キー/
■52752 / inTopicNo.2)  Re[1]: SQLで違うテーブル同士での値を比較したい
□投稿者/ 魔界の仮面弁士 (1766回)-(2010/08/24(Tue) 09:30:45)
2010/08/24(Tue) 09:38:53 編集(投稿者)

No52744 (ぼりびあん さん) に返信
> ウインドオズ2003R2のORACLE10G
Windows Server 2003 R2 の Oracle10g ですね。

> A1とB1は主キー、A2とB2は副キーです。
どうみても、B テーブルはキー制約違反な気がしますが…。

> しかし、よくよく見るとAテーブルの「GGGGGGG」のA4には「2」のはずなのに
> Bテーブルには実際にレコードは1つしかありません。
> こういう状態になってしまっているのを割り出したいのですが

いくつかの方法があるかと思いますが、たとえば

SELECT NVL(A1, B1) KEY1, NVL(A2, B2) KEY2, A4 A_NUM, B_NUM
FROM A FULL OUTER JOIN (SELECT B1, B2, COUNT(*) B_NUM FROM B
GROUP BY B1, B2) C ON A.A1 = C.B1 AND A.A2 = C.B2
WHERE NVL(A4, 0) <> NVL(B_NUM, 0)

では如何でしょう。「B 側にしか無いキー」や、
「A 側にしか無いキーだが、A4≠0な場合」も拾えると思います。
引用返信 編集キー/
■52753 / inTopicNo.3)  Re[1]: SQLで違うテーブル同士での値を比較したい
□投稿者/ ごう (159回)-(2010/08/24(Tue) 09:48:09)
No52744 (ぼりびあん さん) に返信

「サブクエリ」ってわかりますか?
サブクエリを使えば、できるかと思います。

Oracle 使ったことないんだけど(当方の環境はSQL Server)、
一応例を書いておくと

select c.b1, c.b1count, a.a4
from(
select b.b1, count(b.b1) as b1count
from b
group by (b.b1)
)as c, a
where a.a1=c.b1 and a.a4 <> c.b1count


以下のようになります。
| b1    |b1count|a4 |
---------------------
|GGGGGGG|1      |2  |         

引用返信 編集キー/
■52754 / inTopicNo.4)  Re[2]: SQLで違うテーブル同士での値を比較したい
□投稿者/ タスク (3回)-(2010/08/24(Tue) 09:55:23)
プログラマの思考としては、「A4の計算処理を見てみる」
プログラマの対処としては、「A4の計算処理の不具合を修正する」
って視点も必要かも。

そのまんまな処理があるのに同じような処理を別に作ったり、データの
不整合を起こしている根本を残しておくという方が問題で、間違ってる
こと前提の対処療法は最終手段です。

引用返信 編集キー/
■52757 / inTopicNo.5)  Re[3]: SQLで違うテーブル同士での値を比較したい
□投稿者/ タスク (4回)-(2010/08/24(Tue) 10:04:31)
この掲示板、編集キー必須にして欲しい。。。

×対処療法→○対症療法
引用返信 編集キー/
■52821 / inTopicNo.6)  Re[4]: SQLで違うテーブル同士での値を比較したい
□投稿者/ ぼりびあん (2回)-(2010/08/24(Tue) 21:23:59)
ご回答いただき大変に感謝しております。
Oracleで上記のような結果を得たいと思っていた次第なのですが、私が頓珍漢をしておりました。
DB2 9.5が大元になっており一部のデータをOracleへコピーしています。
Oracle側はBテーブルを持っていないためOracleではそもそも比較しようがないことがわかりました。
そこで大元のDB2でやってみたのですが、どうやらせっかく御教示いただいたSQLがエラーになってしまします。

意味がよくわからなくて大変申し訳ないのですが、ご回答いただいたSQLの構文でJOINの後に“(”があると
無効な識別子みたいなエラーを吐き出します。
規格とかが根本から違うのでしょうか?

親切にご回答いただいたのに申し訳なく思っております。
引用返信 編集キー/
■52830 / inTopicNo.7)  Re[5]: SQLで違うテーブル同士での値を比較したい
□投稿者/ サブクエリ (1回)-(2010/08/25(Wed) 09:08:02)
No52821 (ぼりびあん さん) に返信
> そこで大元のDB2でやってみたのですが、どうやらせっかく御教示いただいたSQLがエラーになってしまします。
>
> 意味がよくわからなくて大変申し訳ないのですが、ご回答いただいたSQLの構文でJOINの後に“(”があると
> 無効な識別子みたいなエラーを吐き出します。
> 規格とかが根本から違うのでしょうか?
>
> 親切にご回答いただいたのに申し訳なく思っております。

サブクエリの使い方がDB2の仕様に合ってないだけではないでしょうか?
試してませんが、以下のようにしてみるとどうですか?

SELECT NVL(A1, B1) KEY1, NVL(A2, B2) KEY2, A4 A_NUM, B_NUM
FROM A FULL OUTER JOIN TABLE(SELECT B1, B2, COUNT(*) B_NUM FROM B
GROUP BY B1, B2) AS C ON A.A1 = C.B1 AND A.A2 = C.B2
WHERE NVL(A4, 0) <> NVL(B_NUM, 0)

引用返信 編集キー/
■52925 / inTopicNo.8)  Re[6]: SQLで違うテーブル同士での値を比較したい
□投稿者/ ぼりびあん (3回)-(2010/08/27(Fri) 23:43:51)
ありがとうございました。
皆さんからのヒントをもとになんとか達成できました!
解決済み
引用返信 編集キー/
■52992 / inTopicNo.9)  Re[7]: SQLで違うテーブル同士での値を比較したい
□投稿者/ やまだ (1回)-(2010/08/31(Tue) 16:35:25)
http://oshiete.goo.ne.jp/qa/6131335.html

マルポだったのですね。。
こっちも終了しておいてあげてください。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -