初級シスアドを勉強しています。
テキストに、
SELECT 顧客ID,顧客名 FROM 顧客,注文
WEHRE 注文.顧客ID = 顧客.顧客ID
AND 商品ID =’S01’ OR 商品ID =’S02’
の説明として「顧客」表と「注文」表を「顧客ID」をキーとして
結合し、「商品ID」がS01かS02である行が選択されると
あります。
結合条件と「=01」がANDでむすばれている
と考えると、ORに続く「=S02」は、結合句とは別に
計算されてしまうのではないかと思うのです。
OR のあとにも結合条件の句は有効なのでしょうか?
No.6ベストアンサー
- 回答日時:
>ANDでつないだ条件は、ORより先に計算されるべきだと思うのですが、
それで間違いないですって、試しましたから(笑)
それとですね、
>WHERE句に結合条件を入れた場合は、選択の条件とは(システム側が)
>区別してくれるということでしょうか?
という事はありません。結合条件と選択条件は同じものです。区別はありません。私も初級アドミニ受験のときにここにつまずいたのですが、表結合の仕組みを説明すると、次のようになります。
まず、テーブルSとTがあって、レコードが下のようだったとします。
テーブル:S
No|CD
-----
1 |A
2 |B
3 |B
テーブル:T
CD|Name
--------
A |X
B |Y
この時、Select * From S,T というクエリーを実行すると結果は次のようになります。
No|S.CD|T.CD|Name
------------------
1 |A |A |X
2 |B |A |X
3 |B |A |X
1 |A |B |Y
2 |B |B |Y
3 |B |B |Y
これがテーブルの積で、テーブルSとTのレコード全部の組み合わせを表にするわけです。よってレコード数mの表とnの表の積は、レコード数m×nになります。
これをWhere S.CD=T.CD という条件で抽出すると、
No|S.CD|T.CD|Name
------------------
1 |A |A |X
2 |B |B |Y
3 |B |B |Y
こうなって結果的に表が連結されるわけです。
No.7
- 回答日時:
#3で、解答したrapi7です。
アクセスのSQLで確認したところ
商品IDが’S01’か’S02’になるような
抽出のしかたは
別の方が述べてあるように、
AND句のあとに()をつける必要があります。
ちなみに、セレクト文で指定するフィールド名も
どのテーブルのフィールド名なのかを明示しないと
アクセスの場合、
SQL文を実行したときにエラーがおきるようです。
※私が実行したSQL文は以下の通りです。
------------------------------------------------
SELECT 顧客.顧客ID, 顧客.顧客名
FROM 顧客, 注文
WHERE 注文.顧客ID=顧客.顧客ID
And (注文.商品ID='S01' Or 注文.商品ID='S02')
------------------------------------------------
混乱させてすいませんでした。
結合条件 注文.顧客ID=顧客.顧客ID
抽出条件
(注文.商品ID='S01' Or 注文.商品ID='S02')
として、整理してください。
どうもいろいろありがとうございました。
私も不慣れなアクセスを使って、試してみました。
みなさんのおっしゃるとおり、テキストが間違っていることが
わかりました。
No.5
- 回答日時:
>ANDでつないだ条件は、ORより先に計算されるべきだと思うのですが、
>皆さんのご意見も分かれてしまって、どうしたらよいのだか、、、、。
周りの意見がばらばらで、確信が持てないときは自分で試すのが一番です。
私は、#1の方の解答を見て、???と思ってAccessで試しました。
可能であるならば、フリーのDBを入れるなどして確認してみてください。
No.4
- 回答日時:
おっしゃる通りテキストの方が間違っているのではないでしょうか。
SQLではANDの方がORよりも優先度が高いので、No2の方の指摘の様に括弧をつける必要があると思います。
No.3
- 回答日時:
この問題の場合、
SELECT 顧客ID,顧客名
FROM 顧客,注文・・・・(結合する表名)
WEHRE
注文.顧客ID = 顧客.顧客ID
・・・・(結合のための条件)
AND
商品ID ='SO01' OR 商品ID='SO02'
・・・・(選択のための条件)
と、考えればよいと思います。
この回答への補足
早々の回答ありがとうございます。
WHERE句に結合条件を入れた場合は、選択の条件とは(システム側が)
区別してくれるということでしょうか?
ANDでつないだ条件は、ORより先に計算されるべきだと思うのですが、
皆さんのご意見も分かれてしまって、どうしたらよいのだか、、、、。
No.2
- 回答日時:
説明のとおりに抽出するのであれば、
WHERE句は
WEHRE 注文.顧客ID = 顧客.顧客ID
AND (商品ID =’S01’ OR 商品ID =’S02’)
のように括弧をつけないとおかしいです。
2つのテーブルの直積(デカルト積)で作成されるレコードで、商品IDがS02のものまで一緒に抽出されてしまいます。
No.1
- 回答日時:
結合条件は可能です。
最初のAND条件で、いったん情報が絞り込まれてしまうことはありません。
SQL文は終了するまでの文全てで、実行されます。
最初のANDはWHERE句の「つなぎ」と考えられてはいかがでしょう?
そうすれば、「商品IDが'S01'のもの」または「商品IDが'S02'のもの」と読めませんか?
うまく説明できなくてすいません・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンボボックスで新規登録する場合
-
ExcellVBAのFindに関する質問で...
-
Access フォームのデータがテー...
-
Access VBAでクエリーのレコー...
-
データベースの1要素に複数デー...
-
Excel 2019 のピボットテーブル...
-
「直需」の意味を教えてください
-
エクセルVBAで5行目からオート...
-
Oracle 2つのDate型の値の差を...
-
Access テキスト型に対する指定...
-
Accessでテーブル名やクエリ名...
-
変数が選択リストにありません
-
必須入力項目と入力必須項目
-
ACCESSのクエリで集計で、先頭...
-
INSERT INTO ステートメントに...
-
Accessのフィールド数が255しか...
-
ACCESSでテーブルのチェックを...
-
セルの右クリックで出る項目を...
-
VBAで複数の数式セルを最終行ま...
-
Accessでテーブルの値をテキス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access フォームのデータがテー...
-
Access IF文でテーブルに存在し...
-
Access VBAでクエリーのレコー...
-
ワードでの単純作業の効率化に...
-
ACCESS で マクロの中でフィ...
-
データベースの1要素に複数デー...
-
顧客IDを入力すると顧客名や住...
-
Accessで名寄せグループの関係...
-
別のDBからテーブルをコピーす...
-
シングルクォーテーションとダ...
-
Access 縦(行)のデータを横(列)...
-
Accessデータベースで行と列を...
-
ワードで保存するファイル名の...
-
Access 既に開いているフォー...
-
ADOでレコードを閉じるタイミン...
-
Access クロス集計クエリについて
-
ACCESS2003 Aアクロバットを介...
-
Access レコードロックについて...
-
Access2000 単票フォーム上の...
-
ファイルメーカーの集計につい...
おすすめ情報