SQLserver2005でのWhere句の書き方について悩んでいます

このQ&Aのポイント
  • SQLserver2005でのWhere句の書き方について悩んでいます。複合キーの同時指定を簡潔に行う方法はないでしょうか?
  • SQLserver2005のIN演算子を使用することで、複数の条件を指定して行を取得することができます。ただし、複合キーの場合はすべての組み合わせを個別に指定する必要があります。
  • SQLserver2005では複合キーの同時指定を簡潔に行う方法は存在しません。取得したい行が増えれば増えるほど、記述が複雑になってしまう可能性があります。他のクエリの記述方法を検討することをおすすめします。
回答を見る
  • ベストアンサー

複数キーが存在する場合のIN演算子

閲覧ありがとうございます。 「IN演算子、複合キー」 等で検索を行いましたが、知りたい情報を見つけ切れなかったので投稿させていただきました。 SQLserver2005でのWhere句の書き方について悩んでます。 以下のテーブルからのデータを取得する方法、ご解答いただければ幸甚です。 食べ物テーブル 名前|品種|ID|ジャンル| ------------------------ りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種1|003|野菜| ごぼう|品種2|004|野菜| IDはユニークとなっていて、 主キーは「名前」と「品種」で複合キーになっているとします。 クエリで、特定の1行を複数同時に取得したいと考えてます。 ◆IDを条件とする場合 IN演算子を使う  where IN('001','002','004') と指定 期待値: りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種2|004|野菜| 検索結果: りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種2|004|野菜| ◆「名前」「品種」を指定する場合 IN演算子を使う  where IN('りんご',ごぼう) and IN('品種1','品種2') 期待値: りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種2|004|野菜| 検索結果: りんご|品種1|001|果物| りんご|品種2|002|果物| ごぼう|品種1|003|野菜| ごぼう|品種2|004|野菜| 当然といえば当然なのですが、 期待値の通りに取得するには以下のように記述するしかないのでしょうか。 Where (名前 = 'りんご' and 品種 = '品種1') or (名前 = 'りんご' and 品種 = '品種2') or (名前 = 'ごぼう' and 品種 = '品種2') . . . . 取得したい行が増えれば増えるほど 記述が億劫になってきました。。。 ほかにいいクエリの記述方法があれば教えてください。 Oracleであれば、良い具合に 複合キーの同時指定をできると聞いたのですが、SQLserverには存在しないのでしょうか? よろしくお願い致します。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

WHERE (名前,品種) IN (('りんご','品種1'),('りんご','品種2'),('ごぼう','品種2')) って書きたいのですよね。SQL Serverではこれはできません。 (SQL標準でもないと思いますが) インデックスを使いつつ楽にIN指定する方法は、今回のケースでは、ないと思います。 インデックスを使うのをあきらめて WHERE 名前+'*'+品種 IN ('りんご*品種1','りんご*品種2','ごぼう*品種2') とやるか、地道に書いてください。

Unripe01
質問者

お礼

ご回答ありがとうございます! まさにご回答の通りのINの使い方をやりたいと思ってました。 SQLserverでは、やはりないのですね。残念です。 重そうですが、レコード数と相談して インデックスを使うのは諦めました。 Viewで 名前 + ',' + 品種 as forSearch という列を作って、 in指定することにしました。 ありがとうございます。

関連するQ&A

  • Between演算子と比較演算子の処理速度について

    SQL初心者です。 BETWEEN演算子、比較演算子を使って同じ抽出結果を得られる様に記述ができると思いますが、どちらが実行速度(処理速度)が速いのでしょうか? <BETWEENの記述例> WHERE [金額] BETWEEN 1000 AND 2000 <比較演算子の記述例> WHERE [金額] >=1000 AND [金額] <=2000 BETWEENの方が記述が短くてすっきりしていて見やすいのですが、処理速度に違いがあるのであれば教えてください。宜しくお願い致します。

  • エクセル グループごとの検索について

    グループごとを検索し、その情報を縦列に表示したいのですが、悩んでおります。 横に表示するのは、以下の関数を使って出来たのですが、 =IF(ISNA(MATCH(COLUMN(A4)&$A4,sheet1!$E$2:$E$700,0)) これだと使い勝手が悪く、困っております。 例えば (sheet1)の情報を、 品種    品名   金額  産地    果物    りんご1 200 津軽 果物1 果物    りんご2 250 むつ 果物2 果物    みかん  300    果物3 果物    ぶどう  400    果物4 ーーーーーーーーーーーーーーーーーーーーーーーー 海外果物  パパイヤ 300    海外果物1 海外果物  アドカボ 100    海外果物2 海外果物  バナナ  130    海外果物3 ーーーーーーーーーーーーーーーーーーーーーーーー 野菜    なす   100    野菜1 野菜    にんじん 200    野菜2 野菜    きゃべつ 300    野菜3 野菜    大根   150 練馬 野菜4 野菜    大根2  180 京都 野菜5 (sheet2)において [A]又は[B]のある位置のセルに、品種(この場合、野菜)を打ち込むと、    [ A ] [ B ]なす   100        にんじん 200        きゃべつ 300        大根   150 練馬     大根2  180 京都   このように、品名と値段、産地が縦に並んで欲しいのです。 どうぞお知恵を貸して下さいませ。 宜しくお願いします。

  • パフォーマンスとIN句とAND、実行速度について

    mysqlのMyISAM型でこういったデータの取得は適切なやり方でしょうか。 ・件数は700前後 ・インデックスは主キー以外に使っていません ・トランザクションや外部キーも使っていません SELECT * FROM tabledate WHERE 100<a AND 200>a AND 300<b AND 1000>b AND c='てすと' AND d='テテテ' AND e='testtest' AND f='ttt' AND g IN('123','456','789','122','333','4566','888') AND h IN('666','777') AND ・・・ANDが10個続く・・・ ORDER BY year_manth_day DESC コマンドプロンプトで実行すると結果は0.12secでした。 自分のパソコンの中だけで動かしているのですが、 この実行時間は充分でしょうか。

    • ベストアンサー
    • MySQL
  • 汎用性があるSQL式を教えて欲しいです

    フラグ ナンバー 名前 カテゴリ 日付 1 大根 野菜 10/1 △ 2 りんご 果物 10/2 3 りんご 果物 4 牛肉 肉類 10/3 このような表を フラグ ナンバー 名前 カテゴリ 日付 1 大根 野菜 10/1 3 りんご 果物 10/2 4 牛肉 肉類 10/3 このようにselectで表示させたいのですが 自分が考えたのは果物だけのテーブルを作り、表示させたいようにinner joinで果物のりんご同士を結合させ日付は△のを表示させるように作り 果物以外のテーブルとUnionさせたのですが もう少し汎用性があるものへ昇華させたいとのですが考えが及びません 他にどのように表現出来るでしょうか?

  • SQL - 3つのキーに含まれないもの?

    いつもお世話になっております。 テーブルAと、テーブルA_WRKがあり、 テーブルA_WRKはテーブルAと同じレイアウトです。 2つのテーブルのキーは3つあります。 二つのテーブルをUNIONでくっつけて表示したいのですが、 テーブルA_WRKにあるデータと同じキーのテーブルAのデータは 検索対象からはずしたいのです。 これがキーが一つだったら Select * テーブルA_WRK Where キー項目1 = 条件 Union Select * テーブルA Where キー項目1 = 条件 And キー項目1 Not In (Select * テーブルA_WRK Where キー項目1 = 条件) で検索できると思うのですが、 3つキーがある場合にどう書いてよいかわかりません。 使用DBはSQLServer2000です。 宜しくご教授お願いいたしますm(__)m

  • 【SQL】existsでの商演算

    閲覧ありがとうございます. 現在SQLでデータベースの勉強をしているのですが,existsを用いて商演算を行おうとしてわからない箇所が出てきたので,その点に関しての質問をさせて頂きます. 例として,A,Bと名付けた2つのテーブルを最初に用意します. [テーブル1(名前:机1)] | 番号 |氏名|年齢| 好物 | --------------------------- | 12 | あ | 1 | りんご | | 23 | い | 1 | すいか | | 23 | い | 1 | りんご | | 45 | え | 3 | すいか | | 45 | え | 3 | りんご | [テーブル2(名前:机2)] | 好物 | ---------- | りんご | | すいか | この机1を机2で割ることで,この要素を含む氏名を取り出したいと考えて,以下のようなSQL文を実行しました. select 氏名 from 机1 A where exists( select * from 机2 B where A.好物 = B.好物); [求めている結果表示] | 番号 |氏名| ------------- | 23 | い | | 45 | え | [実際に表示された結果] | 番号 |氏名| ------------- | 12 | あ | | 23 | い | | 23 | い | | 45 | え | | 45 | え | 実行すると (1)氏名が重複で表示されてしまう (2)「りんご」のみ好物の「あ」も表示されてしまう という問題が発生してしまい,色々と調べて考えたものの,結局分からなかったので,今に至ります. 長文・駄文すみませんでした. まだSQLを学び初めて少ししか経っていないので,全く違うことをしていたらすみません.よろしければ,問題解決へのアドバイスをお願いします.

  • IN 句ではインデックスが使用されない?

    環境はDB2で現在チューニング作業を担当しています。 ここでWHEREに COL1='AAA' AND COL2='BBB' AND COL3 IN ('CCC','DDD') とある時、COL1、COL2、COL3を含む複合列インデックスを作成したのですが インデックスが使われません。 ※テーブルスキャンになります 上司はIN句があるから仕方ない。。と言うのですがどうも腑に落ちません。 でも確かにIN句をコメントアウトしCOL1、COL2のみで検索すると インデックスを使います。うーんという感じです。 お手数ですがご意見お願いします。。

  • SELECT文でINを使わずに検索したい

    DBはoracle10gです。 テーブル(A_TBL)は以下の4つのカラムで構成されています。 seq_no(連番),key_1(個人番号),key_2(更新日),status(状態) key_1が同一のレコードは、 最新のレコード(最新とは更新日の大きいレコード)以外のstatusを'0'から'4'にします。 例として実行前と実行後のテーブルは以下のような状態です。 【実行前】 seq_no,key_1,key_2,status 1,001,20080101,1 2,001,20080102,0 3,002,20080101,0 4,003,20080101,0 5,003,20080102,0 6,003,20080103,0 7,004,20080101,0 8,004,20080102,2 【実行後】 seq_no,key_1,key_2,status 1,001,20080101,1 2,001,20080102,0 3,002,20080101,0 4,003,20080101,4 5,003,20080102,4 6,003,20080103,0 7,004,20080101,4 8,004,20080102,2 以下のようなSQLを作成し、更新しようとしました。 update A_TBL set status = '4' where status = '0' and seq_no not in ( select wk2.seq_no from A_TBL wk2, (select max(key_2) as key_2, key_1 as key_1 from A_TBL group by key_1) wk1 where wk2.key_1 = wk1.key_1 and wk2.key_2 = wk1.key_2 and wk2.status = '0' ) このSQLはin句を使っていますが、 in句を使わずに同様の更新を実現することは出来るでしょうか?

  • 別シートのフィールドから同一値検索、隣フィールド値取得の関数を教えてください。

    ■シート1 ---------------- □分類□名 称□ ---------------- |果物|りんご| ---------------- |果物|バナナ| ---------------- |果物|みかん| ---------------- |野菜|トマト| ---------------- |野菜|セロリ| ---------------- |野菜|レタス| ---------------- ■シート2 ---------------- □名 称□分類□ ---------------- |りんご|  | ---------------- |トマト|  | ---------------- |バナナ|  | ---------------- |セロリ|  | ---------------- |みかん|  | ---------------- |レタス|  | ---------------- シート2の名称にてシート1の名称を検索して、シート2に分類を取得することは可能でしょうか。 よろしくお願いします。

  • SQLの条件検索について

    下記のような「果物TBL」というテーブルがあるとします。 果物TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - 01    りんご     150 02    バナナ     250 03    みかん     250 04    ぶどう     300 -------------------------------- また上記のテーブルと全く同じ構成の「果物検索TBL」というテーブルがあるとします。 そのテーブルには、例として下記のような値を入れておきます。 果物検索TBL -------------------------------- ID    名前      値段 - - - - - - - - - - - - - - - - - - - - NULL   りんご     250 NULL   バナナ     NULL -------------------------------- この時、下記のようなSQLだと SELECT DISTINCT 果物TBL.名前 FROM 果物TBL INNER JOIN 果物検索TBL ON (果物TBL.ID = 果物検索TBL.ID AND LEN(果物検索TBL.ID) > 0) OR (果物TBL.名前 = 果物検索TBL.名前 AND LEN(果物検索TBL.名前) > 0) OR (果物TBL.値段 = 果物検索TBL.値段 AND LEN(果物検索TBL.値段) > 0); -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ みかん りんご -------------------------------- という結果になります。(名前:りんご・バナナと値段:250のOR検索) その結果を -------------------------------- 名前 - - - - - - - - - - - - - - - - - - - - バナナ -------------------------------- という結果にするにはどうすればいいでしょうか?(名前:りんご・バナナと値段:250のAND検索、バナナのみマッチ) 単純にORをANDにしてもうまくいきませんでした。 動的にSQLを作れれば良いのですが、この構成は変えられないのでNULL値がネックになり分かりません。 教えてください。 また、記載してるSQLよりもっとスマートな書き方があれば教えてください。