- ベストアンサー
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
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>0=とすると、その後のSQL文のCount(*)の結果が0になるものをひっぱってくるということでしょうか? これはA_WRKを条件で検索した時に、1件でもデータが有れば0より以外の数字が帰ってきますし、条件でレコードが見つからなくても、0が帰ってくるようにCountを使っています。 だから引っ張ってくるって感覚よりも、条件を満たすレコードがA_WRK無い時って条件を追加している感じです。 >これは、テーブルAの何がワークの何と合わないものっていう指定の仕方をしないのですが、テーブルAとテーブルA_WRKのWhere条件を同じ項目で指定する場合のみ有効な構文なのでしょうか? なんていったらいいのでしょうか、0=(SELECT~~条件)ははじめのSelect文でA_WRKで選択しているかどうかを調べようとしているので、条件を同じにしないと意味がなくなってしまいます。 逆にカッコの中で完結するSelect文(複問合せ)を変えることで色々なパターンに対応できると思います。 もうちょっと構文を簡潔にする事が出来るのかもしれないですが、同じ条件を複数書く事で実行コストは低いと思います。
その他の回答 (3)
- DrSumire
- ベストアンサー率39% (264/666)
>で、ちょっとハテナ(?_?)だったのですが、 >WHERE条件で指定するのは二つだけでよいのですか? > >その辺がちょっと理解できませんでしたσ(^◇^;) すみません、手抜きです^^;;; ブラウザの表示によっては改行して見難くなりそうだったので条件を一個省いてしまいました。 コメントしておけばよかったですね、、、
お礼
あ、そうだったんですねσ(^◇^;) いや、もしかしてそうかも・・・とかも思ったのですが。 あげあしとりになってしまってすみませんm(__)m
補足
早速のご回答有り難うございました。 taka451213さん、残念ながらSQLServerでは無理みたいです(;_;) でも、今後Oracleの仕事が来たときのために覚えておきますね。 有り難うございました。 DrSumireさん、とりあえず条件を3つ指定する方法で希望の結果が出ましたが、 もしよろしければもう少し教えていただけませんか? 0=とすると、その後のSQL文のCount(*)の結果が0になるものをひっぱってくるということでしょうか? これは、テーブルAの何がワークの何と合わないものっていう指定の仕方をしないのですが、テーブルAとテーブルA_WRKのWhere条件を同じ項目で指定する場合のみ有効な構文なのでしょうか?
- DrSumire
- ベストアンサー率39% (264/666)
キー三個でユニークが取れているデータなら Select * FROM A_WRK Where Key1 = 条件1 AND Key2 = 条件2 Union Select * FROM A Where Key1 = 条件1 AND Key2= 条件2 And 0 = (Select COUNT(*) FROM A_WRK Where Key1 = 条件1 AND Key2= 条件2) とすれば目的のクエリーが出来るはずです。 キー3個でユニークが取れないデータなら考え方が既に間違っていますので、キー3個で複数のレコードが返ってくるのであれば補足をお願いします。
お礼
有り難うございます。なるほどです。 テーブルの主キーは3つのみです。 で、ちょっとハテナ(?_?)だったのですが、 WHERE条件で指定するのは二つだけでよいのですか? その辺がちょっと理解できませんでしたσ(^◇^;)
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 SQLServerで使用可能かどうかわからないのですが・・・、 SELECT * FROM tbl_1 WHERE (A,B,C) NOT IN (SELECT A',B',C' FROM tbl_2) のようなSQLになると思います。 ORACLEだけだったらごめんなさい・・・。 (^^ゞ
お礼
w(゜o゜)w おお-!なるほどです。 ためしにやってみます。有り難うございました。
お礼
なるほどです。 色々聞いて、お手間を取らせてしまってすみません すっごい勉強になりました。 有り難うございました。