• ベストアンサー
  • すぐに回答を!

SQLでの条件分岐

現在SQLの勉強をしているのですが、条件分岐の方法がわかりません。 全社員を登録したテーブルAと一部社員のみが登録されたテーブルBがあり、両テーブルを外部結合し、Bに登録されているかどうかでフラグを設定しています。 select A.*, B.*, NVL2(A.EMP_NO,'1','0') flag from A left outer join B on A.EMP_NO = B.EMP_NO and A.EMP_NAME = B.EMP_NAME ・上記SQLで設定したフラグの値をもとに、(1)Aのみに登録された社員、(2)Bのみに登録された社員、(3)両テーブルに登録された社員を出すためにはどのようにすれば宜しいでしょうか。 (2)、(3)に関しては、上記パターンならテーブルそのものを出せば済む話なのですが、今後のためにフラグから判定する方法でご教授お願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数96
  • ありがとう数1

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

  • ベストアンサー
  • 回答No.1
  • sngPoi2
  • ベストアンサー率44% (273/611)

動作確認していないので、間違っている場合はごめんなさい。 EXISTS/NOT EXISTSを使用して、Aのみ,Bのみ,両方を個別に抽出し、UNIONで結合するのはどうですか? ※フラグ値とソート順はよしなに -- Aのみに存在 SELECT A.EMP_NO, A.EMP_NAME, 'A' AS FLAG FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE B.EMP_NO = A.EMP_NO AND B.EMP_NAME = A.EMP_NAME ) UNION -- Bのみに存在 SELECT B.EMP_NO, B.EMP_NAME, 'B' AS FLAG FROM B WHERE NOT EXISTS (SELECT * FROM A WHERE A.EMP_NO = B.EMP_NO AND A.EMP_NAME = B.EMP_NAME ) UNION -- 両方に存在 SELECT A.EMP_NO, A.EMP_NAME, 'W' AS FLAG FROM A WHERE EXISTS (SELECT * FROM B WHERE B.EMP_NO = A.EMP_NO AND B.EMP_NAME = A.EMP_NAME )

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • SQL 外部結合

    Access2003でSQLをかいています。 以下のように書いているのですが、 「結合式がサポートされていません」というエラーが発生します。 対応策をご存知の方、お教えいただけますでしょうか。 使用するテーブルは以下の3つです。 ・社員テーブル ・所属テーブル ・判定テーブル それぞれのテーブルの項目は以下のとおりです。 ▼ 社員テーブル -------------------   個人No   入社年度 ▼ 所属テーブル -------------------   個人No   所属コード ▼ 判定テーブル -------------------   所属コード   入社年度   判定フラグ 下記のようなSQLを書いています。 --------------------------------------------------------------------- SELECT A.個人No, C.判定フラグ FROM (社員マスタ A  LEFT JOIN 所属テーブル B       ON (A.個人No = B.個人No))  LEFT JOIN 判定テーブル C       ON (B.所属コード = C.所属コード AND A.入社年度 = C.入社年度) --------------------------------------------------------------------- 最終行の「AND A.入社年度 = C.入社年度」がなければ、SQLは実行できますが 入社年度で条件を絞れないので正しい結果になりません。 LEFT JOIN 句は3テーブル目の条件式で1テーブル目を参照できないということでしょうか?

  • caseを使った条件分岐の加算がうまくいかない

    SQLで条件によって加算するか、しないかを判定したいと思っています。 ■テーブル:test name,flag,number mike,4,1 mike,4,2 mike,5,3 mike,6,4 mike,7,5 mike,8,6 mike,9,7 ■書いたSQL SELECT test.name AS "name", (CASE WHEN flag = '4' THEN sum(number) ELSE NULL END) AS "4", (CASE WHEN flag = '5' THEN sum(number) ELSE NULL END) AS "5", (CASE WHEN flag = '6' THEN sum(number) ELSE NULL END) AS "6", (CASE WHEN flag = '7' THEN sum(number) ELSE NULL END) AS "7", (CASE WHEN flag = '8' THEN sum(number) ELSE NULL END) AS "8", (CASE WHEN flag = '9' THEN sum(number) ELSE NULL END) AS "9" FROM test GROUP BY test.name ■結果 4,5,6,7,8,9 null,null,null,null,null,28 欲しい結果は、フラグが4ののものの合計。flagが「4」の場合は、「3」という結果が返ってきてもらいたいです。 flagが5の場合は、3が返ってきてもらいたいです。 SQLが間違っているのですが、どこが間違っているのかわかりません。どのように修正すればよろしいでしょうか?よろしくお願いします。 環境はSQLiteを使用しています。

  • SQLの作成を手伝っていただけませんか

    会社の組織構造を表す「組織テーブル」とそこに所属する社員を表す「社員テーブル」から、データを抽出したいのですが、わたしが設定しようとした条件とはまったく違う結果が返ってきてしまいます。あつかましいお願いですが、お手伝いいただけたら幸いです。 テーブルは以下のような構造です(*がプライマリーキイ)。 1. 組織テーブル ORGANISATIONS ORG__KEY*, ORG_NAME, ORG_TYPE 一つのレコードにプライマリーキイのほかに組織名と組織タイプが入っています。 2. 社員テーブル EMPLOYEES ORG__KEY*, EMP_NO*, EMP_NAME, SEXUALITY 組織のプライマリーキイとその組織に着任した順序を表すEMP_NOでレコードを特定します。名前と性別(MかFを入力)も登録されています。 抽出条件は常設タイプ(ORGANISATIONS.ORG_TYPE = 'PERM')の組織のうち、所属する社員が全て男性であるものは何かです。また、組織名に「事業部」という文字列を含まないことも条件です。 わたしの書いた以下のSQLでは社員のいない組織、つまり「組織テーブル」に登録されているだけで「社員テーブル」にレコードを持たない組織のIDが返ってきます。 select ORG__KEY from ORGANISATIONS a where ORG_TYPE = 'PERM' and not ORG_NAME like '%事業部%' and 'M' = all (select SEXUALITY from EMPLOYEES b where a.ORG__KEY = b.ORG__KEY) 男性社員だけの組織が存在しなければしないで、レコードを返さないようにSQLを書かなければならないのですが、どのように改善すればよいでしょうか。組織タイプや組織名の条件を外して検索すると、社員なし組織だけでなく、実際に男性社員だけの組織も取得できるので、まったく違うことをやっているわけではないとおもいますが、何かが足りないのでしょうか。 まだまだ初心者です。説明がこんがらかっているかもしれませんが、よろしくお願いします。

  • SQLの書き方について

    すみません、SQL初心者なので変な質問かもしれませんが、、SQLの書き方がわからないので教えてください。以下のような二つのテーブルがあるとします。 (Table: EMP2014) EMPNO | EMPNAME | TEL 100 | TARO | 03-1111-2222 101 | HANAKO | 03-2222-3333 (Table: EMP2015) EMPNO | EMPNAME | TEL 200 | JIRO | 03-3333-4444 201 | KYOKO | 03-4444-5555 このテーブルからSQLを実行して、以下のような結果を得たいです。 EMPNO | EMPNAME | TEL 100 | TARO | 03-1111-2222 101 | HANAKO | 03-2222-3333 200 | JIRO | 03-3333-4444 201 | KYOKO | 03-4444-5555 JOINというのは二つのテーブルを左右に並べた形での結合だと思うんですけれど、僕がやりたいのは内容の似たテーブル(上記の場合全く同じカラム)を上下に単純にくっつけて一つの出力結果にしたいです。ビューなどをつくって仮想的に一つの表にできるものなのでしょうか? とても簡単なのかも知れませんが、、宜しくお願いします。

  • SQL 条件付きDELETE文について

    SQLを見よう見まねでいじることになりました。。 AテーブルからBテーブルの以下の条件が当てはまるデータを削除する SQLを作りたいと考えています。  (1)Bテーブルの『DAT_FLG』が1  (2)A.テーブル『KNR_NO』 と Bテーブル『KNR_NO』が同じ  (3)Aテーブル『STR_YMD』 と Bテーブル『STR_YMD』が同じ  (4)Aテーブル『END_YMD』 と Bテーブル『END_YMD』が同じ 以下のようなSQLを考えましたがエラーとなってしまいました。 DELETE FROM A JOIN B ON A.KNR_NO = B.KNR_NO and A.STR_YMD = B.STR_YMD and A.END_YMD = B.END_YMD B.DAT_FLG = '1' DBはoracleを使っています。 どなたか教えてください。

  • SQL ある条件を指定して検索する

    以下のようなテーブルがあります。 実際には毎日レコードが追加され全体で500万レコードです。 num name year point flag 101 yamada 1972 10 0 102 nakanishi 1978 20 1 103 sasaki 1980 40 0 104 nakai 1985 10 1 105 oda 1988 50 0 106 harada 1995 20 0 107 ishikawa 1999 10 0 基本的にはflagという列には「0」が入りますが、 稀に(数日に数行程度)「1」が入ることがあります。 毎晩1度だけSQLを実行し、「1」の行の行数(上の例の場合は2)、num、pointを 取得する必要があります。 そのためのSQLを教えて下さい。 またそのSQLの性能面を重視する必要があります。 よろしくお願いします。

  • SQLがわかりません。。

    すみません、単純な質問かもしれませんが、どう組み立てたら良いのか悩んでいますので、SQL文について質問させてください。 以下の様な2つのテーブルがあります。 ○テーブル1 ----------------------------------- ID bangou1 bangou2 1 1 2 2 3 4 3 2 4 ○テーブル2 ----------------------------------- ID bangou flag 1 1 1 2 2 1 3 3 0 4 4 1 ●希望する取得結果 テーブル1のID:1,ID:3 bangou1、bangou2は、テーブル2のIDを設定しています。 このとき、テーブル2のflagに0が設定されている場合はbangou1、bangou2のどちらにあってもテーブル1のIDは取得したくありません。 このSQLを組み立てる方法がいまいち思いつきません。 どうかアイデアをお願いします。

  • 3ビットのフラグを持つ2個の変数の組み合わせによる分岐の上手な書き方

    お世話になります。 C言語において、3つの状態を持っている変数で状態の組み合わせによって分岐するプログラムを作りたいと思っています。 3ビットのフラグによって2進数で001,010,100の3個のどれかの状態であるとして、以下の条件で分岐させるさせたいです。 ・2個とも同じ状態のとき ・片方が001,010で、もう一方が100 ・片方が001で、もう一方が010 自分では以下のように書いたのですが、条件式もっと簡潔に書くことはできないでしょうか?よろしくお願いいたします。 #include<stdio.h> typedef struct{ int name;//識別番号 unsigned int flag:3;//状態を表すフラグ }Status; int main(void) { Status a,b;//例として2変数のみ定義 a.name=10; a.flag=1; b.name=20; b.flag=2; if(!(a.flag^b.flag)){ printf("2個とも同じ状態のとき\n"); } else if( ( (a.flag&1 || a.flag&2) && b.flag&4 ) || ( a.flag&4 && (b.flag&1 || b.flag&2 ) ) ){ printf("片方が001か010で、もう一方が100\n"); } else if( (a.flag&1 && b.flag&2) || (a.flag&2 && b.flag&1) ){ printf("片方が001で、もう一方が010\n"); } }

  • SQL文

    SQLの初心者です。 Aテーブル(a項目,b項目,c項目)とBテーブル(a項目,d項目,e項目)のテーブルがあります。 d項目順でAテーブルの項目のみ出力するにはどうしたらいいのでしょうか。 例えば次のSQL文ではd項目順で出力されますが結合の為、AテーブルとBテーブルの全項目が出力されます。 SELECT * FROM Aテーブル LEFT OUTER JOIN DITKM ON Aテーブル.a項目 = Bテーブル.a項目 ORDER BY Bテーブル.d項目 次のSQL文のようにAテーブルの項目を選択したらAテーブルの項目のみ出力する事はわかります。 SELECT a項目,b項目,c項目 FROM Aテーブル LEFT OUTER JOIN DITKM ON Aテーブル.a項目 = Bテーブル.a項目 ORDER BY Bテーブル.d項目 今回はAテーブルの項目数が少ないのでこれでもいいのですが、項目数が多くなると大変です。 上の様に項目を選択しないでAテーブルの項目を全て出力する事は可能なのでしょうか。 宜しくお願い致します。

  • 結合SQLに関して

    結合SQLに関して ある3つのテーブルが存在し、TABLE1の情報を核として、TABLE2,TABLE3と 結合させて情報を取得しようと考えています。 TABLE1とTABLE2だけであれば LEFT OUTER JOIN等を駆使すれば、TABLE1を核として 全件表示可能かと思いますが、TABLE3も含めて結果のような形にしたい場合は、 どのようにSQLを記述すれば良いでしょうか。。。。 初歩的な質問で申し訳ありませんが、教えて下さい。 TABLE1 NO 1 2 3 TABLE2 NO,BUSYO_CODE 1,123 2,123 3,456 TABLE3 BUSYO_CODE,BUSYO_NAME 123,総務 456,経理 結果 NO,BUSYO_CODE,BUSYO_NAME 1,123,総務 2,123,総務 3,456,経理 よろしくお願いします。