お世話になります、
二つの表の項目を比較して値を取得するSQLを作成しているのですが、うまくいきません。

具体的には
Aテーブル

NAME | PRICE
------|------
リンゴ | 100
------|------
オレンジ | 200
------|------
ブドウ | 300
------|------


Bテーブル

NAME | PRICE
------|------
リンゴ | 1000
------|------
オレンジ | 200
------|------
ブドウ | 1300
------|------


という二つのテーブルA、Bがあったとします。
このA,Bの二つのテーブルのそれぞれの果物のPRAICEを比較してBのPRICEがアップしている果物を出力するという
SQLを教えてください。

<ほしい結果>
NAME | PRICE
------|------
リンゴ | 1000
------|------
ブドウ | 1300


よろしくお願いします。

A 回答 (5件)

No.1の ymmasayan です。


hana432 さんの指摘は重要です。

> AテーブルのNAMEとBテーブルのNAMEは、1:1と考えてよいですか?

この条件が満たされない場合は副照会を使う必要が出てくるでしょう。
ただ、そのあとに多少疑問があります。

> もし、「Aテーブルには無くてBテーブルにはある」もしくはその逆のパターンのデータが存在するのであれば上記の条件では不備があるので注意してください。

このような不備はありません。一方がなくても比較をしないだけ(本当は比較にすら行かない)なので、心配する必要はありません。

この回答への補足

こんにちは、ご指摘ありがとうございます。

指摘のとおり、AテーブルのNAMEとBテーブルのNAMEは、1:1と考えてけっこうです。

Aテーブルに有るものはBテーブルには必ず存在すると考えてください。

以上よろしくお願いします。

補足日時:2001/11/28 00:19
    • good
    • 0

No.3に頂いた補足の通りなら No.1のSQL文で通るはずです。


No.1、No.2、No.4(前半)の3つの回答が一致しています。
    • good
    • 0

Aに無くてBのみがある場合にも、対象として抽出したりする時には、下記のようなSQLも面白いかもね。



select b.name, b.price from a,b
where a.name = b.name
and b.price > a.price
union
select b.name, b.price from b
where b.name not in
(select a.name from a);
 
蛇足SQLでした。
    • good
    • 0

AテーブルのNAMEとBテーブルのNAMEは、1:1と考えてよいですか?それなら、NAMEをリレーションとする条件をWHERE句に書いて、AとBの比較をするだけでいいかなーと思います。



select
B.NAME,
B.PRICE
from
Aテーブル A,
Bテーブル B
where
A.NAME = B.NAME -- AとBで一致するNAMEのものを取得
and A.PRICE < B.PRICE -- 一致する中で、Bの値段が高いものを取得
;

もし、「Aテーブルには無くてBテーブルにはある」もしくはその逆のパターンのデータが存在するのであれば上記の条件では不備があるので注意してください。
その時はまた補足してください。もしかしたらお役に立てるかも。
    • good
    • 0

select B.NAME,B.PRICE FROM A,B 


where A.NAME=B.NAME AND B.PRICE>A.PRICE

でよいと思うのですが。
よくやる間違いは A.NAME=B.NAME 部分の定義忘れです。  
    • good
    • 0

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

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

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

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

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

QMs Access テーブルBにテーブルAのCDを充てたい。(クエリ?紐づけ?リレーションシップ?)

初心者です。よろしくお願いします。
そもそも、できるのかどうか、できたとして、どうするのかがわからないです。

次の2つのテーブルがあります。
テーブルマスタA には、①市町村CD ②市町村名 ③住所(番地なし)
テーブル受付データB には、①NO ②住所(番地まであり)③受付日 ④⑤・・・

具体的には、以下のとおり。(サンプル)
テーブルマスタA
①    ②      ③
10000  松戸市    千葉県松戸市
20000  鎌ケ谷市本町 千葉県鎌ケ谷市本町
30000  横須賀市   神奈川県横須賀市
テーブル受付データB
①    ②
1    千葉県松戸市五香5-5-5    
2    千葉県鎌ケ谷市本町さくらがおか8-88-8 ひまわりアパート302
3    神奈川県横須賀市横須賀8-7-8   

テーブル受付データBにおいて、②の部分(市町名まで)と、
テーブルマスタAの③をなんとか紐づけて、

クエリで合体させたい。
=テーブル受付データBに、テーブルマスタAの市町村CDを充てたい。
A①市町村CD  A②市町村名 B② B③ B④ B⑤
とすることを切望しています。

***********
たとえば、2つのテーブルに同じフィールドがあって、
それをリレーションシップで紐づけるのは容易ですが、
今回のようなパターンは、
もしかして、私は、ナンセンスなことをしようと苦闘している?と思ってきました。
フィールド名が同じじゃないのに、それを紐づけることができるのでしょうか?

できるとして、どのようにすればよいのでしょうか?

どうぞ、教えていただきたく、お願いいたします!!!

初心者です。よろしくお願いします。
そもそも、できるのかどうか、できたとして、どうするのかがわからないです。

次の2つのテーブルがあります。
テーブルマスタA には、①市町村CD ②市町村名 ③住所(番地なし)
テーブル受付データB には、①NO ②住所(番地まであり)③受付日 ④⑤・・・

具体的には、以下のとおり。(サンプル)
テーブルマスタA
①    ②      ③
10000  松戸市    千葉県松戸市
20000  鎌ケ谷市本町 千葉県鎌ケ谷市本町
30000  横須賀市   神奈川県横...続きを読む

Aベストアンサー

パラメータが表示されたのは指定したフィールドがないからです。
テーブル名とフィールド名を使用している名前に変更してください。

InStr関数は
ある文字列 (string1) の中から指定された文字列 (string2) を検索し、最初に見つかった文字位置を返す文字列処理関数です。
InStr(string1, string2)

やっていることはテーブル受付データBの②(住所)の中からテーブルマスタAの③(住所)を検索し
文字列がある位置を出しています。
必要なのは文字列が含まれているデータのみなので条件を>0としています。

試しにInStrの部分をなくしてクエリを実行してみてください。
「テーブルマスタA」のレコード数*「テーブル受付データB」のレコード数のデータが表示されるはずです。

Q二つのテーブルで比較

1回目
select * from 本データ where 名前='高橋' or メール='x@x.com';
2回目
select * from 仮データ where 名前='高橋' or メール='x@x.com';

データを抽出したいわけではなくて、
同エントリーのあるなしを判断したいだけです。

現使用方(IIS ASP VbScript MDB)としては
if rs.EOF then で
空なら処理続行・あるなら処理無効として判別しています。

1回で終わらないので上記2回にわけて実行し随時判定してます。
これを1回の処理で終わらせることはできないでしょうか?

http://okwave.jp/qa4174831.htmlやJOIN等色々参考にしてみましたが、うまくいかず・・・
過去質問にもあるんだろうけど、それの検索文も見当せずで困っています。
初歩的で申し訳ないですが、よろしくお願いします。

Aベストアンサー

UNIONクエリでは如何でしょう。

SELECT 1 AS 区分,* FROM 本データ WHERE ~
UNION
SELECT 2 AS 区分,* FROM 仮データ WHERE ~

上記SQLでレコードセットを開きます。
(1)1レコードも無ければ本データ、仮データともない
(2)2レコードあれば本データ、仮データともある
(3)1レコードの場合、区分=1なら本データ、区分=2なら仮データのみ

但し、本データ、仮データとも同じフィールド数、同じ属性の並びで
なければなりません(フィールド名は異なっていても良い)

Q二つのテーブルを一つのクエリにまとめる方法

 ACCESS2000、ウィンドウズ98です。

 二つのデーターベースがあり、まったく同じ名前・すべてのフィールド名も型もプロパティも同一の(COPYなので)テーブルを有しています。

 第三のデーターベースを作り、そこに二つのテーブルをまとめたテーブルかクエリーを作る方法(校舎が二つあって、それぞれ違う子供達のデータなのです)がありましたら教えてください。

 外部リンクの方法は知っております。

Aベストアンサー

可笑しいですね。さすがはアクセス(笑)
ではこのように変更して下さい。
SELECT DISTINCTROW [basic-info1].[ID] FROM [basic-info1]
UNION ALL
SELECT DISTINCTROW [basic-info].[ID] FROM [basic-info];
これではエラーにならないはずです。
当方で確認しました。

Q主キーが二つのテーブルのselect方法

SQL文に関して質問します。
主キーが二つあるテーブルを作成したのですが。
[table_A]
ID | SubID | Name
1 | 0 | pochi
1 | 1 | tama
2 | 0 | koma
3 | 0 | koro
3 | 1 | shiro
4 | 0 | buchu
このテーブルから、IDが二つ以上あるものに関してはSubIDの大きいほうのレコードだけ取得して
ID | SubID | Name
1 | 1 | tama
2 | 0 | koma
3 | 1 | shiro
4 | 0 | buchu
という結果を出したのですが、select文が思いつきません。
副問い合わせも考えたのですが、うまくいきませんでした。
ちなみにRDBSはSQLServer2000を使用しています。

よろしくお願いします。

Aベストアンサー

下記でどうでしょ?
手元に環境が無いので確認はしてませんが。

SELECT t1.*
FROM table_A as t1, (SELECT ID,max(SubID) as xSID FROM table_A GROUP BY ID) as t2
WHERE t1.ID=t2.ID and t1.SubID=t2.xSID;

Q二つのSQLサーバーのテーブルからビューを作成するには

わけあってAサーバーとBサーバーに同じ項目構成の、同じ名前のテーブルがあります。只入っているデータが異なってます。
Aサーバーの"H"テーブルには 3行のデータがあります。
  Bサーバーの"H"テーブルには2行のデータがあります。
  
ちなみにリンクサーバーはセットアップしてあり、二つのサーバーの間のセキュリティは確立してあります。
以上のような場合、ビューで二つの"H"テーブルのすべての行を表示できますか?
結合ではなく、AサーバーのテーブルのデータにBサーバーのテーブルのデータを追加した感じのビューを作りたいです。


どなたか知っている方がいましたら、教えてください。

Aベストアンサー

Books Onlineで
「リンク サーバーの設定」
「分散クエリ」
「リンク サーバー名を使用したデータ ソースの識別」
「UNION演算子」~「UNION による結果の結合」
等を参照してみて下さい。


人気Q&Aランキング

おすすめ情報