• ベストアンサー

二つの表の項目を比較して値を取得するSQL

お世話になります、 二つの表の項目を比較して値を取得する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 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

No.1の ymmasayan です。 hana432 さんの指摘は重要です。 > AテーブルのNAMEとBテーブルのNAMEは、1:1と考えてよいですか? この条件が満たされない場合は副照会を使う必要が出てくるでしょう。 ただ、そのあとに多少疑問があります。 > もし、「Aテーブルには無くてBテーブルにはある」もしくはその逆のパターンのデータが存在するのであれば上記の条件では不備があるので注意してください。 このような不備はありません。一方がなくても比較をしないだけ(本当は比較にすら行かない)なので、心配する必要はありません。

noname#1752
質問者

補足

こんにちは、ご指摘ありがとうございます。 指摘のとおり、AテーブルのNAMEとBテーブルのNAMEは、1:1と考えてけっこうです。 Aテーブルに有るものはBテーブルには必ず存在すると考えてください。 以上よろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.5

No.3に頂いた補足の通りなら No.1のSQL文で通るはずです。 No.1、No.2、No.4(前半)の3つの回答が一致しています。

すると、全ての回答が全文表示されます。
  • kougasha
  • ベストアンサー率32% (34/105)
回答No.4

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でした。

すると、全ての回答が全文表示されます。
  • hana432
  • ベストアンサー率37% (6/16)
回答No.2

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テーブルにはある」もしくはその逆のパターンのデータが存在するのであれば上記の条件では不備があるので注意してください。 その時はまた補足してください。もしかしたらお役に立てるかも。

すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

select B.NAME,B.PRICE FROM A,B  where A.NAME=B.NAME AND B.PRICE>A.PRICE でよいと思うのですが。 よくやる間違いは A.NAME=B.NAME 部分の定義忘れです。  

すると、全ての回答が全文表示されます。

関連するQ&A