• ベストアンサー

Access2007でSQLの複数列副問い合わせについて

VB2005+Access2007を使用しております SQL文の複数列副問い合わせについて教えて下さい 検索をしても他のデータベースのものばかりヒットし、解決できません SELECT * FROM Uriage WHERE (Date, DateID) = (SELECT Date, DateID FROM Uriage WHERE NAME = 'cup') これを実行すると 「メイン クエリの FROM 句の予約語 EXISTS を使用しないフィールド を複数返すサブクエリを作成しました。サブクエリのSELECT ステート メントを変更し、1 つのフィールドだけを指定してください。」 というエラーがでてしまいます。 形をかえ、 SELECT * FROM Uriage WHERE Date = (SELECT Date FROM UriageList WHERE NAME = 'cup') AND DateID =(SELECT DateID FROM UriageList WHERE NAME = 'cup') これを実行すると、 「このサブクエリでは 1 つのレコードしか返せません。」 というエラーがでてしまいます。 また、 SELECT * FROM Uriage WHERE (Date) IN (SELECT Date FROM UriageList WHERE NAME = 'cup') AND (DateID) IN (SELECT DateID FROM UriageList WHERE NAME = 'cup') を実行したところ、 エラーはでないものの、抽出結果が異なるものが出てきてしまいました。 これを解決するにはどのようにしたらよいのでしょうか? よろしくお願いいたします。 なお、某知恵袋にも同様の質問をしてしまいましたが、 回答者様への回答や追加質問が出来ず、 こちらに再質問させて頂きました。申し訳ございません。

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

  • ベストアンサー
回答No.2

知恵袋にも回答しましたが、 INNER JOIN を使えばどうでしょうか。 副問い合わせより高速にできる可能性が大です。 SELECT Uriage.Date, Uriage.DateID FROM Uriage INNER JOIN UriageList ON Uriage.Date = UriageList.Date AND Uriage.DateID = UriageList.DateID WHERE UriageList.NAME = 'cup';

letterfin
質問者

お礼

INNER JOINを使用し、無事解決できました 的確なご指摘、ありがとうございます。 しかも、副問合わせより高速にできるとの事。 勉強になります。 あちらの掲示板でも、ありがとうございます 結果、マルチポストになった件、 改めて謝罪いたします。 みなさま、もうしわけありませんでした

その他の回答 (2)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

サブクエリもクエリですからレコードの集合を返します ですから、値を一つしか指定できないようなところで サブクエリを使うと >「メイン クエリの FROM 句の予約語 EXISTS を使用しないフィールド >を複数返すサブクエリを作成しました。サブクエリのSELECT ステート >メントを変更し、1 つのフィールドだけを指定してください。」 こういわれてしまうのです 集合に対する条件式の書き方としては >SELECT * >FROM Uriage >WHERE >(Date) IN (SELECT Date FROM UriageList WHERE NAME = 'cup') >AND >(DateID) IN (SELECT DateID FROM UriageList WHERE NAME = 'cup') これであっています >エラーはでないものの、抽出結果が異なるものが出てきてしまいました。 どういう抽出を期待しているのか分かりませんが この書き方だとNameが"cup"であるDateの集合とDateIDの集合の重なる部分だけが 抽出されることになります

letterfin
質問者

お礼

エラーの御説明、ありがとうございます。 エラー内容すら理解できない事、恥ずかしく思います。 >どういう抽出を期待しているのか分かりませんが 説明不足、申し訳ありませんでした 希望する抽出結果は、 UriageListテーブルの中からName='CUP'である「Date」と「DateID」を抜き出し、 Uriageテーブルのキーとなっている「Date」と「DateID」列を抜き出す ことを期待しておりました。 結果、INNER JOINを使用し、解決することができました。 アドバイスありがとうございました

  • inadomez
  • ベストアンサー率40% (9/22)
回答No.1

エラーメッセージのとおり、Existsを使用すればよいのではないでしょうか。 SELECT * FROM Uriage WHERE EXISTS ( SELECT * FROM UriageList WHERE UriageList.NAME = 'cup' AND UriageList.DataID = Uriage.DataID AND UriageList.Date = Uriage.Date )

letterfin
質問者

お礼

EXISTSを使用しても出来そうですね 挑戦してみます アドバイス、ありがとうございます

関連するQ&A