こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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')

を実行したところ、
エラーはでないものの、抽出結果が異なるものが出てきてしまいました。


これを解決するにはどのようにしたらよいのでしょうか?
よろしくお願いいたします。

なお、某知恵袋にも同様の質問をしてしまいましたが、
回答者様への回答や追加質問が出来ず、
こちらに再質問させて頂きました。申し訳ございません。

投稿日時 - 2008-11-24 03:21:08

QNo.4502447

困ってます

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

知恵袋にも回答しましたが、
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';

投稿日時 - 2008-11-24 10:55:42

お礼

INNER JOINを使用し、無事解決できました
的確なご指摘、ありがとうございます。
しかも、副問合わせより高速にできるとの事。
勉強になります。

あちらの掲示板でも、ありがとうございます
結果、マルチポストになった件、
改めて謝罪いたします。
みなさま、もうしわけありませんでした

投稿日時 - 2008-11-24 15:45:51

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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の集合の重なる部分だけが
抽出されることになります

投稿日時 - 2008-11-24 13:26:00

お礼

エラーの御説明、ありがとうございます。
エラー内容すら理解できない事、恥ずかしく思います。

>どういう抽出を期待しているのか分かりませんが
説明不足、申し訳ありませんでした

希望する抽出結果は、
UriageListテーブルの中からName='CUP'である「Date」と「DateID」を抜き出し、
Uriageテーブルのキーとなっている「Date」と「DateID」列を抜き出す
ことを期待しておりました。

結果、INNER JOINを使用し、解決することができました。
アドバイスありがとうございました

投稿日時 - 2008-11-24 15:57:54

ANo.1

エラーメッセージのとおり、Existsを使用すればよいのではないでしょうか。

SELECT *
FROM Uriage
WHERE EXISTS (
SELECT
*
FROM UriageList
WHERE UriageList.NAME = 'cup'
AND UriageList.DataID = Uriage.DataID
AND UriageList.Date = Uriage.Date
)

投稿日時 - 2008-11-24 09:50:04

お礼

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

投稿日時 - 2008-11-24 15:46:40