- 締切済み
場合によって条件を変えるSQL
ORACLE環境下、SQLにて以下のような条件でデータを取得したいです。 AテーブルとBテーブルを結合して、Bテーブルから名称を取得する。 <Aテーブル> id (key) 番号1 番号2 A01 001 n0001 A02 null n0002 <Bテーブル> code(key) 名前 番号1 番号2 c0001 太郎 001 n0001 c0002 次郎 002 n0002 (1)A.番号が入力されていれば A.番号1=B.番号1 AND A.番号2=B.番号2を条件にする (2)A.番号が入力されていなければ A.番号=B.番号を条件からはずす。 A.番号2=B.番号2 のみで検索する。 <欲しい結果> A01→太郎を取得 A02→次郎を取得 入力されていたら条件に加え、入力されていなかったら 条件から外す、というSQLを教えていただけないでしょうか。 よろしくお願いいたします。
- apoc
- お礼率45% (40/87)
- Oracle
- 回答数6
- ありがとう数0
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- bin-chan
- ベストアンサー率33% (1403/4213)
#5です。Bテーブルとエイリアスが不足してました。 (1)と(2)をunionしてはどうでしょう? select a.id, b.名前 from Aテーブル a, Bテーブル b where a.番号1 is not null and a.番号1 = b.番号1 union select a.id, b.名前 from Aテーブル a, Bテーブル b where a.番号1 is null and a.番号2 = b.番号2 ;
- bin-chan
- ベストアンサー率33% (1403/4213)
(1)と(2)をunionしてはどうでしょう? select a.id, b.名前 from Aテーブル where a.番号1 is not null and a.番号1 = b.番号1 union select a.id, b.名前 from Aテーブル where a.番号1 is null and a.番号2 = b.番号2 ;
- yamada_g
- ベストアンサー率68% (258/374)
>nullの場合は条件から完全に外したいのです。 の意図がよく分かりません・・・ さきほどのSQLで希望の結果になると思うのですが。 SQLから消したいのであれば、プログラムで動的にSQLを組み立てればいいのではないでしょうか。
- yamada_g
- ベストアンサー率68% (258/374)
No.1、No.2です。 何回かリロードしても回答が反映されていなかったので、再度回答したところ重複してしまいました。 すみません・・・
- yamada_g
- ベストアンサー率68% (258/374)
orで二つの条件を書く。 select a.id, b.名前 from Aテーブル a inner join Bテーブル b on ( (b.番号1 = a.番号1 and b.番号2 = a.番号2) or (a.番号1 is null and b.番号2 = a.番号2) ); もしくは、Aテーブルの番号1がnullのときはBテーブルの番号1で結合する。 ただし、こちらの方法ではBテーブルの番号1にnullが入る場合はうまくいきません。 select a.id, b.名前 from Aテーブル a inner join Bテーブル b on ( b.番号1 = nvl(a.番号1,b.番号1) and b.番号2 = b.番号2 ); でどうでしょうか。
- yamada_g
- ベストアンサー率68% (258/374)
orで2つの条件を書く。 select a.id, b.名前 from Aテーブル a inner join Bテーブル b on ( (b.番号1 = a.番号1 and b.番号2 = a.番号2) or (a.番号1 is null and b.番号2 = a.番号2) ); もしくは、Aテーブルの番号1がnullのときはBテーブルの番号1で結合する(=全件ヒット)。 select a.id, b.名前 from Aテーブル a inner join Bテーブル b on ( b.番号1 = nvl(a.番号1,b.番号1) and b.番号2 = a.番号2 ); でどうでしょうか。
関連するQ&A
- ある条件でのSQLの取得方法について
以下の条件でのSQLのデータの取得方法が分かりません。 2つのテーブルがあるとします。 ・テーブルA キー 項目1 10 X 20 Y ・テーブルB キー 項目2 項目3 10 5 C 10 6 D 12 6 E ここで取得する条件として ■テーブルAにあるのは、必ず取得します。 ■テーブルAのキーとテーブルBのキーは繋がり、繋がったテーブルBの情報は 別レコードとして取得します。 ■テーブルAのキー1つに対して、テーブルBのキーは無いかも知れないし、 複数件あるかも知れません。 無い場合はテーブルAの情報のみを出力し、複数件ある場合はその全てを出力します。 ■テーブルBの項目2が同じ値のデータがある場合、テーブルBを出力したレコードと 同じレコードに、項目2が同じデータの情報を出力します。 項目2が同じデータが無い場合はこの情報は出力しません。 項目2が同じ値のデータは最大2件しかありません。 上記の例の場合に出力したい結果 ・出力テーブルC キー フラグ 項目1 項目2 項目3 項目2が同じキー 項目2が同じ値 10 テーブルA X 10 テーブルB 5 C 10 テーブルB 6 D 12 E 20 テーブルA Y (テーブルC のフラグとは、テーブルAの情報かテーブルBの情報かを示します) これを出来ればSQL、出来なければPL/SQLで取得したいのですが どちらの場合でも取得の方法に悩んでいます。 どのような方法で取得できるのでしょうか?
- ベストアンサー
- Oracle
- SQLの問題です。
以下のような二つのテーブルがあります。 社員テーブル 社員番号 社員氏名 1 花子 2 太郎 所属テーブル 社員番号 所属番号 1 10 1 20 2 30 欲しいのは以下の結果です。 1 花子 2 太郎 以下のSQLを実行すると、 SELECT distinct a.社員番号, a.社員氏名, b.所属番号 FROM 社員 a,所属 b where a.社員番号 = b.社員番号 order by 所属番号 1 花子 1 花子 2 太郎 となってしまいます。 先に述べたとおりの結果を取得するにはどういうSQLを書いたらいいでしょうか? お知恵を貸してください。宜しくお願いします。 Oracle8iを使用しています。
- ベストアンサー
- その他(データベース)
- SQLの使用方法について(動的な結合条件の変更方法について)
SQL Server2005を使用しています。 以下のような動作を実現したいのですが、どのようなSQLとなるのでしょうか? 以下のような構成のテーブルがあるとします。 テーブルA 分類1(PK) 分類2(PK) 名前 1 空文字 山田 1 1 山田太郎 1 2 山田花子 2 空文字 鈴木 テーブルB 番号(PK) 分類1 分類2 100 1 空文字 101 1 1 外部から受け取るパラメータはテーブルBの番号です。 次の番号を受け取った際に、以下の結果を取得したいのですが、 どのようなSQLとなるのでしょうか? 番号100 ↓ 山田 山田太郎 山田花子 番号101 ↓ 山田太郎 以下の様なSQLを作成して試してみたのですが、番号2をJOINの条件として指定しているため、 番号100の時に望む結果を得ることが出来ませんでした。 SELECT * FROM テーブルA AS A LEFT JOIN ( SELECT * FROM テーブルB WHERE 番号 = パラメータ ) AS B ON A.分類1 = B.分類1 AND A.分類2 = B.分類2 サブクエリのB.分類2が空文字の場合は、JOINの条件から省くようなことは可能なのでしょうか?
- ベストアンサー
- SQL Server
- 1回のSQL文で取得できますか
Postgresでテーブルが2つある場合、 その2つに登録されているデータを全て取得したいのです。 例えば Aテーブル Bテーブル Key1 key2 A Key1 key2 B ---------- --------- 01 01 A1 01 02 A2 01 02 B2 01 03 A3 01 03 B3 01 04 B4 とある場合、 1度のSQLで下のような結果を取得できますか? Key1 key2 A B ------------ 01 01 A1 NULL 01 02 A2 B2 01 03 A3 B3 01 04 NULL B4 お願いいたします。
- ベストアンサー
- PostgreSQL
- SQLでの抽出条件
SQL初心者です。初歩的な質問だと思いますが、ご教授願います。 以下のような2つのテーブルがあります。 【テーブルA】 グループ 社員番号 A 1 A 2 A 3 B 4 B 5 B 6 C 7 C 8 D 9 D 1 【テーブルB】 社員番号 1 9 テーブルBの社員番号と一致する場合、テーブルAをグループ単位で抽出しないようにしたいです。 ・グループAは社員番号1が一致するため抽出しない。 ・グループDは社員番号1と9が一致するため抽出しない。 【取得結果】 グループ 社員番号 B 4 B 5 B 6 C 7 C 8 説明が分かりづらくて申し訳ありませんが、よろしくお願い致します。
- ベストアンサー
- SQL Server
- 【至急】SQLの結合について教えてください。
select * from A where ab = '1' and cd = '2' select ef from B where ab = '1' and cd = '2' and ef = '3' 至急質問させてください。 上記SQLを結合したいです。(Oracleです) 取得したいデータはAのテーブルの全項目で、 取得条件として、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 キー項目は両テーブルとも同じ(ab, cd)です。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。
- 締切済み
- SQL Server
- SQLで質問があります。
すみません。初めて質問させて頂きます。 以下のような条件のSQL生成は可能でしょうか。 可能な場合どのようなSQLになるかご教授頂けないでしょうか。 <条件> テーブルA,B,Cで一致する社員コード AND テーブルAの年月日がnull AND テーブルBの区分コードが"01"以外 AND テーブルCの部門コードでテーブルDを検索し 取得した会社コードが"00001" <取得したい項目> テーブルA.社員コード テーブルA.社員氏名 テーブルC.区分コード <テーブルA> 社員コード* 会社コード 年月日 社員氏名 <テーブルB> 社員コード* 会社コード 区分コード <テーブルC> 社員コード* 会社コード 部門コード <テーブルD> 会社コード* 部門コード* *は主キー よろしくお願い致します。
- ベストアンサー
- Oracle
- SQLについて教えてください
お世話になります。 SQLについて教えてください AテーブルとBテーブルからCテーブルを作成したいのですが、 KEYをキーにAテーブルのIDが1で、YYMMが一番新しい項目(最大の項目)を 取得し、Cテーブル作成したいのですが、どのようにするのでしょうか? Aテーブル Bテーブル Cテーブル KEY ID yymm KEY KEY YYMM AAA 0 200612 AAA AAA 200611 AAA 1 200611 BBB BBB 200611 AAA 1 200609 BBB 0 200611 CCC 1 200611
- ベストアンサー
- SQL Server
- 否定条件回避
お世話になります。 エラーデータチェックのSQLを作成していますが、 難航しています。 バージョン:Oracle10.2 Aテーブル a1 b1 c1 a2 b2 a3 b3 c3 Bテーブル a1 b1 a2 gg a3 上のように2つのテーブルがあるとします。 2つのテーブルの各項目がエラーあるかどうかをチェックします。 上の場合は2行目のレコードがエラーとし、取得したいです。 結合条件はa,b,c。ただどれもNULLの場合があって、3つのうち必ずどれかが値が入っています。A.a1とB.a1があっていれば、正常データとします。 大量データため、WHERE句に否定条件はちょっと厳しいです。 自分が考えたのはMINUS 例:SELECT * FROM Aテーブル LEFT JOIN Bテーブル ON (A.a = B.a OR A.b = B.b OR A.c = B.c) MINUS SELECT * FROM Aテーブル LEFT JOIN Bテーブル ((ON A.a = B.a OR (A.a IS NULL OR B.a IS NULL)) (AND A.b = B.b OR (A.b IS NULL OR B.b IS NULL)) (AND A.c = B.c OR (A.c IS NULL OR B.c IS NULL))) 後々考えたらやっぱり抜けるところがある気がします・・・ どなたかご教授いただけると助かります。 よろしくお願いします。
- 締切済み
- Oracle
補足
回答いただきありがとうございます。 nullの場合は条件から完全に外したいのです。 ※番号1 is null の場合、nullで検索しない。 もし代案ありましたらよろしくお願いします。