SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<Aテーブル>
A1A2A3A4A5
------- ------- ------- ------- ----------
XXXXXXX XX1ABC32009/05/08
WWCWWCW WW2CCB12008/03/21
DDDDDDD DD1JPN52007/08/08
GGGGGGG GX9SOX21977/01/04
FFFFFFF USJNPB32001/09/11


<Bテーブル>
B1B2B3B4B5
------- ------- ------- ------- ----------
XXXXXXX XX1ibichaoshimu2002/07/05
XXXXXXX XX1takeshiokada2005/07/15
XXXXXXX XX1kamoshu1857/09/25
WWCWWCW WW2waowao2008/10/22
DDDDDDD DD1uihhh2006/06/30
DDDDDDD DD1jojoj x5xx1999/09/09
DDDDDDD DD1momohara2005/03/07
DDDDDDD DD1itaiu-2003/12/22
DDDDDDD DD1komanogoal2007/04/26
GGGGGGG GX9 damerecord2009/11/14
FFFFFFF USJ ikitai1995/08/15
FFFFFFF USJ sstebuspi2004/01/05
FFFFFFF USJ bbpp2009/08/23

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

「SQLで違うテーブルの値を比較して値に差」の質問画像

このQ&Aに関連する最新のQ&A

A 回答 (4件)

SELECT A.* FROM Aテーブル A


INNER JOIN
TABLE(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2) B
ON A.A1=B.B1 AND A.A2=B.B2
AND A.A4<>B.SU

または

WITH B(B1,B2,SU) AS
(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2)
SELECT A.* FROM Aテーブル A
INNER JOIN B ON A.A1=B.B1
AND A.A2=B.B2 AND A.A4<>B.SU

こんなのでどうでしょうか?
後者の方が標準的(他のDBシステムでも
使える可能性が高い)かと思います。
    • good
    • 1
この回答へのお礼

後者のものが使うこと出来ました
大変参考になりました
ありがとうございます!

お礼日時:2010/09/05 09:21

No.1です。


自分への返信の後半部分はNo.2さん宛のものですかね?
DB2は触ったことがないのですが、MINUSの代わりに EXCEPT を使えばよさそうです。

SELECT
A1,A2,A4
FROM Aテーブル
EXCEPT
SELECT
B1,B2,COUNT(*)
FROM Bテーブル
GROUP BY B1,B2
    • good
    • 1
この回答へのお礼

ありがとうございます 助かりました!

お礼日時:2010/09/05 09:20

考え方を整理します。


(1)BテーブルのB1、B2をキーとして件数を取得
(2)Aテーブル上で同じキーを持ち、かつ(1)の数と
  A4の値が異なるものを抽出

SELECT A.* FROM Aテーブル A
INNER JOIN
(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2) B
ON A.A1=B.B1 AND A.A2=B.B2
AND A.A4<>B.SU
    • good
    • 2
この回答へのお礼

回答ありがとうございます。
Oracleで上記のような結果を得たいと思っていた次第なのですが、私が間違いをしておりました。
DB2 9.5が大元になっており一部のデータをOracleへコピーしています。
Oracle側はBテーブルを持っていないためOracleではそもそも比較しようがないことがわかりました。
そこで大元のDB2でやってみたのですが、どうやらせっかく御教示いただいたSQLがエラーになってしまします。

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

本当にポカミスですみません。。。

お礼日時:2010/08/24 21:26

記載の内容が全てで難しいこと考えなくていいなら、minusを使ってはいかがでしょうか?



SELECT
A1,A2,A4
FROM Aテーブル
MINUS
SELECT
B1,B2,COUNT(*)
FROM Bテーブル
GROUP BY B1,B2

これでBテーブルの件数とA4の値が一致しないAテーブルのレコード(全項目ではないですが)が抽出できます。

余談ですが、B1は主キーとは言わないです。主キーとはテーブル内の一意のレコードを特定できるものを言います。
あと、Oracleのバージョンも書いた方がいいと思います。バージョンによって使用できるSQLも違ってきますので。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
Oracleで上記のような結果を得たいと思っていた次第なのですが、私が間違いをしておりました。
DB2 9.5が大元になっており一部のデータをOracleへコピーしています。
Oracle側はBテーブルを持っていないためOracleではそもそも比較しようがないことがわかりました。
そこで大元のDB2でやってみたのですが、どうやらせっかく御教示いただいたSQLがエラーになってしまします。

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

本当にポカミスですみません。。。

お礼日時:2010/08/24 21:26

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q主語が複数でも比較級than any other 単数名詞?

問題集に

There are more violins than any other instrument in an orchestra.

という英文がありました。

主語がviolinsなので、instrumentも複数にしても良いのでしょうか?

Mt.Fuji is higher than any other mountain in Japan.のような例文では富士が単数だから1対1で比較する必要があり、ゆえにmountainは単数だという説明を目にしたことがあります。

今回の英文の、主語は複数形で比較対象は単数形を理屈でどう説明できるのでしょうか?

Aベストアンサー

>Eagles soar higher than any other birds. 

これは、birdsと言う表現で、eagles以外の鳥全てを含んだ意味になっているからです。eaglesと、その他の鳥を全部いっしょくたにして比較しています。

>There are more violins than 【any other instruments】 in an orchestra.

と言うのは、やはりおかしくて、any other instrumentが正しいのです。
なぜなら、バイオリンとその他の楽器全ての合計数を比較しているわけではないからです。比べているのは、バイオリンと例えばトランペット、例えばトロンボーンと言うように比べているわけですから、あくまで一つ一つの楽器の種類です。
もし、There are more violins than 【any other instruments】 in an orchestra.と言ってしまえば、トランペット4、トロンボーン5、シンバル3、小太鼓2のようにバイオリン以外の楽器の数を合計し、その総合計よりもバイオリンの数が多いと言うことになります。

>Eagles soar higher than any other birds. 

これは、birdsと言う表現で、eagles以外の鳥全てを含んだ意味になっているからです。eaglesと、その他の鳥を全部いっしょくたにして比較しています。

>There are more violins than 【any other instruments】 in an orchestra.

と言うのは、やはりおかしくて、any other instrumentが正しいのです。
なぜなら、バイオリンとその他の楽器全ての合計数を比較しているわけではないからです。比べているのは、バイオリンと例えばトランペット、例えばトロン...続きを読む

QSQL文について(片方のテーブルに存在しないレコード抽出)

以下のような2つのテーブルがあったとして、
2つともに存在する「店コード」を抽出するのはSQLは分かるのですが、
片方に存在しない「店コード」(以下の例の場合、「2」)を抽出するSQLを
一文で書くにはどうすればいいのでしょうか?

<店テーブル>
店コード住所・・・(その他、基本情報)
1aaa
2bbb
3ccc

<販売テーブル>
店コード販売品目・・・(その他、販売数など)
1xxx
3zzz

Aベストアンサー

オプティマイザ次第だけど、NOT-INは、あまりお勧めでない。
外部結合も索引があっても有効に使われないので、お勧めでない。

select * from A where not exists(select 1 from B where A.店コード=B.店コード);

Q比較級、最上級 A diamond is more precious than any other

比較級、最上級
A diamond is more precious than any other jewel.

A diamond is the で始まるように書き換えるとどうなりますか?

Aベストアンサー

学校文法の正解としては

A diamond is the most precious jewel of all. か
A diamond is the most precious of all the jewels. か。

Mt. Fuji is higher than any other mountain in Japan.
Mt. Fuji is the highest mountain in Japan.
のように最上級では名詞をつけて書き換えることが多いです。

Qグループ中で最大値を含む行を抽出するSQLはどう書けば良いでしょうか

列A,Bでグループ化し、グループ中で列Cが最大値の列を取得したいのです。
数百万件あるので極力低コストにしたく、
副問合せはINDEXが効かないと聞いたのですが、
それ以外思いつきませんでした。

副問合せしない方法はないでしょうか?
また、副問合せの中でコストの低いSQLはどんなものでしょうか。

■テーブルです
名前 型
CUST_ID CHAR(8)
BRANCH_ID CHAR(4)
VALID_DATE DATE
MYDATA VARCHAR2(20)

CUST_ID BRAN VALID_DA MYDATA
19740704 0000 06-01-01 comment0001
19740704 0000 05-12-01 comment0000
19740704 0000 06-02-01 comment0002
19740704 0001 06-01-01 comment0011
19740704 0001 06-03-01 comment0012

■このような結果が欲しいのですが。。。
CUST_ID BRAN VALID_DA MYDATA
19740704 0000 06-02-01 comment0002
19740704 0001 06-03-01 comment0012

■考えたSQLです(検証済)
select a.cust_id,a.branch_id,a.valid_date,a.mydata
from test a,(select cust_id,branch_id,max(valid_date) as mvd from test group by cust_id,branch_id) b
where
a.cust_id=b.cust_id and
a.branch_id=b.branch_id and
a.valid_date=b.mvd ;

select a.cust_id,a.branch_id,a.valid_date,a.mydata
from test a
where not exists
(select * from test b where a.cust_id=b.cust_id and a.branch_id < b.branch_id) ;

select cust_id,branch_id,valid_date,mydata
from test
where (cust_id,branch_id,valid_date) in (select cust_id,branch_id,max(valid_date) from test group by cust_id,branch_id) ;

select cust_id,branch_id,valid_date,mydata
from (select cust_id,branch_id,valid_date,mydata,max(valid_date) over(partition by cust_id,branch_id) as mvd from test)
where valid_date=mvd ;

列A,Bでグループ化し、グループ中で列Cが最大値の列を取得したいのです。
数百万件あるので極力低コストにしたく、
副問合せはINDEXが効かないと聞いたのですが、
それ以外思いつきませんでした。

副問合せしない方法はないでしょうか?
また、副問合せの中でコストの低いSQLはどんなものでしょうか。

■テーブルです
名前 型
CUST_ID CHAR(8)
BRANCH_ID CHAR(4)
VALID_DATE DATE
MYDATA VARCHAR2(20)

CUST_ID BRAN VALID_DA MYDATA
19740704 0000 06-01-01 comment0001
197407...続きを読む

Aベストアンサー

>副問合せしない方法はないでしょうか?

副問い合わせを使うから、必ずしも非効率なSQLであるとは
言い切れませんよ?

>副問合せの中でコストの低いSQLはどんなものでしょうか。

オプティマイザに聞かないと判りません。
素直に実行計画を出して、比較して下さい。

索引の有無やデータの分布など、いろいろな要素が絡み合って、
SQLの効率が変わります。
それらの情報無くして、効率的なSQLを選択するのは不可能です。

Q比較級 than SV について

こんにちは。比較級を勉強しているのですが、以下の文で
thanの後がSVになる場合とそうでない場合の違いがわかりません。
どういう時に than SV になるのか教えていただけると助かります。

〈thanの後がSVにならない場合〉
She walks more slowly than other girls.
He can speak English better than me.
Tom got to the station earlier than his friends.

〈thanの後がSVになる場合〉
He read the book more carefully than I did.
My brother studies much longer than I do.
Do you study harder than he does?

よろしくお願いします!

Aベストアンサー

こちらでいろいろな考えが出てきています。

http://oshiete.goo.ne.jp/qa/1654320.html

単純にいうと,接続詞か前置詞か。
さらに接続詞なら省略も含まれる。
さらには,接続詞と言っても従属接続詞的な場合もあれば等位接続詞
的な場合もあり,関係代名詞的なものもある。

than the record のように接続詞的には説明できず,
句構造(前置詞)としか考えられないものが出てくる。

He is taller than me.
は長い間,日本では誤りだとされてきました。
he is tall と I am tall と比べるんだから I という主格。

現実には He is taller than I. という英語は避けられ,
He is taller than I am.
とするか,
He is taller than me. とする。

than me というのはネイティブにとっては極めて普通の英語です。

He likes her better than he likes me. の省略が
He likes her better than me. だという意見もよく見ますが,
He likes her better than I like her. も
He likes her better than me. と言えます。

まさしく,日本語の「彼は私より彼女の方が好きだ」という日本語で
「私より」が「彼は」との比較か,「彼女を」との比較か
あいまいになるのと同じ。
than me というのはそういう表現です。

上であげた質問の回答にもありますが,than ~は先に表現ありき,
文法の説明は後付け。

こちらでいろいろな考えが出てきています。

http://oshiete.goo.ne.jp/qa/1654320.html

単純にいうと,接続詞か前置詞か。
さらに接続詞なら省略も含まれる。
さらには,接続詞と言っても従属接続詞的な場合もあれば等位接続詞
的な場合もあり,関係代名詞的なものもある。

than the record のように接続詞的には説明できず,
句構造(前置詞)としか考えられないものが出てくる。

He is taller than me.
は長い間,日本では誤りだとされてきました。
he is tall と I am tall と比べるんだから I という主格...続きを読む

Qoracleのsqlについて質問です。 TESTというテーブルがあり、その項目には時間と名前と値があ

oracleのsqlについて質問です。
TESTというテーブルがあり、その項目には時間と名前と値があります。

[TESTテーブル]
TIME NAME ATAI
--------------------
06:00 A 2
08:00 B 3
05:00 C 1
06:00 C 4
06:00 A 2

select文で現在は以下の条件でspoolしてログ出力させているのですが、
select name,avg(ATAI)
from TEST
where TIME >= 06:00
and TIME < 07:00
and NAME in(A,B,C)
group by NAME;

上記の結果が、
NAME ATAI
--------------
A 2
C 4

となり、NAMEのBが出力しない状態です。
ログ出力させたから、その後でエクセルのマクロで集計をするのですが、毎回Bを手で入力してからマクロを実行してと大変なため、

NAME ATAI
--------------
A 2
B 0
C 4

のように上記のwhereの条件にあってなくてもNAMEを強制的に表示させることは可能でしょうか?

oracleは11g
OSはlinuxです。

どなたかわかる方、いらっしゃいましたらご教授お願い致します。

oracleのsqlについて質問です。
TESTというテーブルがあり、その項目には時間と名前と値があります。

[TESTテーブル]
TIME NAME ATAI
--------------------
06:00 A 2
08:00 B 3
05:00 C 1
06:00 C 4
06:00 A 2

select文で現在は以下の条件でspoolしてログ出力させているのですが、
select ...続きを読む

Aベストアンサー

NAME自体を正規化していないのでしょうか?

もしそうであれば、発行したSQLにTESTテーブルに対して
(SELECT DISTINCT NAME FROM TEST)をサブクエリで
RIGHT JOINしてみてはいかがでしょうか?

Qmore than ? better than ?

いつもお世話になっております。
中学生に聞かれているんですが、
I like baseball better than any other sport.
という文はOK でしょうか?わたしは、better than の部分をmore than にすべきではないかと思うのですが、説明ができません・・・。
more than は可能だと思うのですが、better than でもOKですか?
宜しくご指導ください。

Aベストアンサー

手元に「詳説 レクシス プラネットボード 103人のネイティブスピーカーに聞く生きた英文法・語法」という本があります。その中にお尋ねと同じ質問をして得られた解答と分析があります。それによると、「使用率はあまり変わら」ず、betterはmoreに比べて「やや口語である人もいる」とあり、「学習者はいずれを用いてもよいだろう」としています。ちなみに、英米の差はほとんどないという結果が表から読み取れます。

QSQLの作成を手伝っていただけませんか

会社の組織構造を表す「組織テーブル」とそこに所属する社員を表す「社員テーブル」から、データを抽出したいのですが、わたしが設定しようとした条件とはまったく違う結果が返ってきてしまいます。あつかましいお願いですが、お手伝いいただけたら幸いです。

テーブルは以下のような構造です(*がプライマリーキイ)。
1. 組織テーブル ORGANISATIONS
ORG__KEY*, ORG_NAME, ORG_TYPE
一つのレコードにプライマリーキイのほかに組織名と組織タイプが入っています。

2. 社員テーブル EMPLOYEES
ORG__KEY*, EMP_NO*, EMP_NAME, SEXUALITY
組織のプライマリーキイとその組織に着任した順序を表すEMP_NOでレコードを特定します。名前と性別(MかFを入力)も登録されています。

抽出条件は常設タイプ(ORGANISATIONS.ORG_TYPE = 'PERM')の組織のうち、所属する社員が全て男性であるものは何かです。また、組織名に「事業部」という文字列を含まないことも条件です。

わたしの書いた以下のSQLでは社員のいない組織、つまり「組織テーブル」に登録されているだけで「社員テーブル」にレコードを持たない組織のIDが返ってきます。

select ORG__KEY from ORGANISATIONS a
where ORG_TYPE = 'PERM'
and not ORG_NAME like '%事業部%'
and 'M' = all
(select SEXUALITY from EMPLOYEES b
where a.ORG__KEY = b.ORG__KEY)

男性社員だけの組織が存在しなければしないで、レコードを返さないようにSQLを書かなければならないのですが、どのように改善すればよいでしょうか。組織タイプや組織名の条件を外して検索すると、社員なし組織だけでなく、実際に男性社員だけの組織も取得できるので、まったく違うことをやっているわけではないとおもいますが、何かが足りないのでしょうか。
まだまだ初心者です。説明がこんがらかっているかもしれませんが、よろしくお願いします。

会社の組織構造を表す「組織テーブル」とそこに所属する社員を表す「社員テーブル」から、データを抽出したいのですが、わたしが設定しようとした条件とはまったく違う結果が返ってきてしまいます。あつかましいお願いですが、お手伝いいただけたら幸いです。

テーブルは以下のような構造です(*がプライマリーキイ)。
1. 組織テーブル ORGANISATIONS
ORG__KEY*, ORG_NAME, ORG_TYPE
一つのレコードにプライマリーキイのほかに組織名と組織タイプが入っています。

2. 社員テーブル EMPLOYEES
ORG__KEY*...続きを読む

Aベストアンサー

仕様通りに書くだけが道ではないです。
視点を変えれば、違った書き方でもいけるでしょう
最初の SELECT と組織の積集合は結合に変換しても
いいですが、遅くなりそうな雰囲気がします。

SELECT ORG_KEY
FROM EMPLOYEES
WHERE SEXUALITY = 'M'
--
MINUS
SELECT ORG_KEY
FROM EMPLOYEES
WHERE SEXUALITY = 'F'
--
INTERSECT
SELECT ORG_KEY
FROM ORGANISATIONS
WHERE
ORG_TYPE = 'PERM'
AND
ORG_NAME NOT LIKE '%事業部%'

内容の検証はお任せします。

Qthan any other か than any others か?

問題集の中に、
I like this song better than any others.
This book was more useful than any other.
という2つの文がのっていました。どっちが正しいのでしょうか?
I like this song better than any other song.
ならわかるのですが。

Aベストアンサー

回答者No.1です.お礼を拝見しました.

はい,両方とも使われる…ということですから,両方とも正しいと言ってよいでしょう.

Q複数レコードを横並び1レコードで抽出する方法

ORACLE10gを使用しています。

似た内容の質問があったので
QNo.1828920:検索対象のデータが「複数レコード」を「1レコード」として獲得するSQL
も見てみたのですが、実際には他にも抽出条件や抽出項目が多いので、
できればGROUP BYは使いたくないと思い、質問させていただきます。


・TABLE)イメージ
CD|NO|NM
10 | 0 | あ
10 | 1 | い
10 | 2 | う
10 | 3 | え

・前提
画面でCD:10およびNO:0~NO:2と範囲指定します。

・求める結果
下記のように範囲指定したNO分、NMを横並びに抽出したいです。
10,あ,い,う

・考えた内容
VBを使用しているのでプログラム中で動的に抽出項目、FROM句、WHERE句を
追加しようと考えました。
TABLE.NOは2桁なので最大指定で0~99になる可能性があります。その場合FROM句のTABLE別名が99個に
なってしまいますが、書き方として問題ないのか不安です。
何かアドバイスがありましたらお願いします。

・SQL案
SELECT
TABLE0.CD,
For I = 0 To 2
TABLE & I.NM AS NM & I,
Next K

FROM
For J = 0 To 2
TABLE TABLE & I,
Next K

WHERE
TABLE0.CD = 10 AND

For K = 0 To 2
TABLE & K.NO = K AND
Next K

ORACLE10gを使用しています。

似た内容の質問があったので
QNo.1828920:検索対象のデータが「複数レコード」を「1レコード」として獲得するSQL
も見てみたのですが、実際には他にも抽出条件や抽出項目が多いので、
できればGROUP BYは使いたくないと思い、質問させていただきます。


・TABLE)イメージ
CD|NO|NM
10 | 0 | あ
10 | 1 | い
10 | 2 | う
10 | 3 | え

・前提
画面でCD:10およびNO:0~NO:2と範囲指定します。

・求める結果
下記のように範囲指定したNO分、NMを横並びに抽出し...続きを読む

Aベストアンサー

No1です。すいません、ちょっと違うみたい。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング