- ベストアンサー
likeの使い方について
すみません。教えてください。。 ACCESSで下記2つのテーブルをunionでくっつけて nameの右端(1桁目)が同一のもの(CとCCなど)を抽出するため 下記のような構文を構築したのですが抽出されません。。 お手数ですがこちら何が原因となっているか教えていただけないでしょうか。。 よろしくお願い致します。 id name id name 1 a 1 a 2 b 2 b 3 c 3 cc 4 d 5 ee 5 e select * from (select * from tb1 union select * from tb2) as A where name like '*c' or name like '*d' or name like '*e'
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
たいへん失礼しました,(4)と(6)は私の構文ミスです,ANo.5への補足どおりの結果で問題ありません。 残った(5)の結果については釈然としないですね。 (7) select * from (select * from tb1 union all select * from tb2) (8) select right(name,1) from (select * from tb1 union all select * from tb2) の実行結果(全列名と全行データ)を提示していただくことはできますか。質問文中のサンプルデータは小さいものなので,それほど手間にはならないと思うのですけれど。
その他の回答 (5)
- jjon-com
- ベストアンサー率61% (1599/2592)
>下記の部分ですでに対象のデータ何も表示されませんでした エラーで実行できないのではなく,あくまで正常実行されたが結果が何も表示されないとおっしゃっているのですね? >どこの時点で結果が抽出されないか確認しましたら 次のようなSQLの各部分の実行については結果が抽出されるが,ANo.4への補足のような句がすべて揃った時点で結果が抽出されなくなるとおっしゃっているのですね? (1) select * from tb1 (2) select * from tb2 (3) select * from tb1 union all select * from tb2 (4) select Right(name,1) sum(id) as sum_id from (select * from tb1 union all select * from tb2) (5) select * from (select * from tb1 union all select * from tb2) where right(name,1)in('c','d','e') (6) select * from (select * from tb1 union all select * from tb2) group by right(name,1) ちなみに私は,Windows XP Professional SP2 + Access 2003 SP3 を使用しています。
補足
ご回答ありがとうございます! >エラーで実行できないのではなく,あくまで正常実行されたが結果が何も表示されないとおっしゃっているのですね? はい。そうなります。。。 >(1) select * from tb1 >(2) select * from tb2 >(3) select * from tb1 union all select * from tb2 上記に関しては正常に実行されます。 >(4) select Right(name,1),sum(id) as sum_id >from (select * from tb1 union all select * from tb2) 集計関数の一部としてRight(name,1)を含んでいないクエリを実行しようとしているというエラーになってしまいます。。。 >(5) select * >from (select * from tb1 union all select * from tb2) >where right(name,1)in('c','d','e') 上記を実行すると正常実行結果が何も表示されません。。 >(6) select * >from (select * from tb1 union all select * from tb2) >group by right(name,1) *で選択したフィールドはグループ化できませんとでます。。 私はWindows vista home premiam + Access 2003です。
- jjon-com
- ベストアンサー率61% (1599/2592)
ANo.1です。具体データのおかげで,おっしゃりたいことが分かりました。 次のコードでいけます。 ------------------------------------------------ SELECT tail_chr, sum_id FROM tb1, tb2, ( SELECT Right(name,1) AS tail_chr, sum(id) AS sum_id FROM ( select * from tb1 union all select * from tb2 ) WHERE Right(name,1) In ('c','d','e') GROUP BY Right(name,1) ) WHERE Right(tb1.name, 1) = tail_chr and Right(tb2.name, 1) = tail_chr; ------------------------------------------------ 三重になっているもっとも内側のselect文がunion all。単なるunionだと(1,'a')―(1,'a')や(2,'b')―(2,'b')のようにまったく同じ行を1つにまとめてしまうのでダメです。 真ん中のselect文は,Right()関数で末尾の1文字(tail_chr)だけを抽出してその値でグループ化し,idの合計(sum_id)を求めています。'c','d','e'以外は捨ててよいのですよね? 2つの表を1つにまとめた後で処理しているので,この段階の出力結果には,一方の表にしか存在しない('d', 4)も含まれています。そこで,tb1にもtb2にも(and条件)存在するかを調べているのがもっとも外側のselect文です。
補足
ありがとうございます!! しかしながら試してみたのですが結果が抽出されませんでした。。。 どこの時点で結果が抽出されないか確認しましたら、 下記の部分ですでに対象のデータ何も表示されませんでした。。。 こちら何が原因なのでしょうか。。。 select Right(name,1) as tail_car,sum(id) as sum_id from (select * from tb1 union all select * from tb2) where right(name,1)in('c','d','e') group by right(name,1)
御存知なのに、私が勘違いしているかも知れませんが、ユニオンクエリというのは、2つのテーブルを『縦に』つなげるものです。 もし2つのテーブルが id name 1 a 2 b 3 c 4 d 5 e と id name 1 a 2 b 3 cc 5 ee なら id name 1 a 2 b 3 c 4 d 5 e 1 a 2 b 3 cc 5 ee が、まず、ユニオンクエリ(UNION ALL)の結果になります。 外していたら恥ずかしいのですが、あえて話を一歩進めると。 id1 name1 id2 name2 1 a 1 a 2 b 2 b 3 c 3 cc 4 d 5 ee 5 e の型のテーブルにするには、普通の選択クエリを使います。 但し、それぞれのテーブルにキーとなるフィールドが必要です。 idがキーかなと、も見えるのですが、4 d 5 ee の行がそうなっていません。
補足
ご回答ありがとうございます! 今回はあくまで縦列から1桁目(右端)が同じものを 抽出したく思っております。。 やはりちょっと難しいでしょうか。。
- CHRONOS_0
- ベストアンサー率54% (457/838)
>where name like '*c' or name like '*d' or name like '*e' この条件はnameの右端がc、d、eのもを抽出しろですよ >nameの右端(1桁目)が同一のもの(CとCCなど)を抽出 とは程遠いですね 右端が同じものが複数あるものを抽出したいのであれば 右端を取り出してグループとし、カウントした値が2以上のもの を取り出すとかしないとだめでしょう
補足
ご回答ありがとうございます! 了解致しました。 記載いただいたアプローチの方法で再度作成を試みてみます!
- jjon-com
- ベストアンサー率61% (1599/2592)
何が原因ですかと問われても,そのselect文はAccessでもエラーなく実行されますので,何がしたいのですかと問い返すだけなのですけれど。 質問文中の入力データから具体的にどんな出力データが得られるのが望みなのか,提示していただいた方が話が早いように思います。
補足
ご回答ありがとうございます! 最終的には2つのテーブルからnameの1桁目が同じもののidを 合計した結果を出力したいのです。 つまり結果は下記になります。 name id(sum) c 6 e 10 それにはまず「nameの右端の1桁目が一致するものを抽出する」クエリを作成しなければならないと思いご質問させて頂きました。。
お礼
ご連絡が遅くなってしまい大変申し訳ありませんでした!! こちら頂いた情報で再度組み直しましたところ、 正常に抽出することができました!! 大変ありがとうございました!!