• 締切済み

SQLを教えてください!!

テーブルAとテーブルBがあり、両方に存在しないものを抽出してエラーとする処理を行いたいのですが、 どういうSQlを書いたらいいのか教えてください。 下記例としてテーブルにデータがあったとしたら、結果として 004 商品D 005 商品E 006 商品G というデータを抽出したいのですが・・ テーブルA             テーブルB -------------        ----------------------- コード  商品名 NO コード   商品名 001 商品A        1 001 商品A 002 商品B        2 001  商品A 003 商品C        3 002   商品B 004 商品D        4 003 商品C 006 商品G        5 003 商品C                 6 005 商品E

みんなの回答

  • msystem
  • ベストアンサー率42% (79/186)
回答No.3

ちょっと試したことがないのでわかりませんが、次のようなのはどうでしょう (select キー1,キー2 from A minus select キー1,キー2 from B) union (select キー1,キー2 from B minus select キー1,キー2 from A)

  • msystem
  • ベストアンサー率42% (79/186)
回答No.2

条件にもよりますが、not inよりもnot existのほうが処理速度が速くなるときがありますよ。(索引データ件数による)

NYANMARU
質問者

お礼

すいません! やってみたのですが、エラーが出て動きません! GROUP BYで式が設定されていませんとなってしまいます。(BYオラクル) 又、キーが例では、1項目だけだったのですが、複数で成り立つ場合も作りたいので合わせて教えてください。

noname#1802
noname#1802
回答No.1

select * from テーブルA where コード not in (select コード from テーブルB) union select * from テーブルB where コード not in (select コード from テーブルA) Group by 1,2 order by 1 環境によってマチマチではないかと思うのですが (order by 1 が使えないとか・・・・) 算出するSQL概念はこれでいいかと思います。

NYANMARU
質問者

お礼

ありがとうございました。 私は、NOT EXISTSを考えたのですが、ご回答頂いた方が効率がいいみたいですね。助かりました! さっそく使わせて頂きます。

関連するQ&A

  • ACCSESSのSQLで教えてください。

    すみません! SQL初心者なのですが教えてください。 下記のようなtableというテーブルなのですが こちらのテーブルをデータが増加しても(1)から(2)のように select表示させるにはどうすればよいか教えて頂けないでしょうか・・・。 何卒よろしくお願い致します。 テーブル名:table カラム名:NO,kigou (1) table |NO|kigou| |1 |a | |2 |b | |3 |c | |4 |d | |5 |e | ↓ (2) |NO1|kigou1|NO2|kigou2|NO3|kigou3| |1 |a |2 |b |3 |c | |4 |d |5 |e | ・・・

  • ACCESS SQLステートメントについて初心者です。

    お知恵を貸してください。 ACCESSでSQLステートメントで 『Aテーブル』 ID  商品コード1 商品コード2 1    1111    2222 2    2222    3333 3    4444    5555   『Bテーブル(商品コードマスター)』 商品コード  商品名 1111     ああああ 2222     いいいい       3333     うううう 4444     ええええ 5555     おおおお AテーブルとBテーブルを結合して ID  商品コード1 商品名    商品コード2   商品名 1    1111  ああああ     2222    いいいい 2    2222  いいいい     3333    うううう 3    4444  ええええ     5555    おおおお というCテーブルを作りたいです。 商品コード1と商品コード2の両方共 Bテーブルの商品コードから商品名を取得したいのですが、できないのですが・・・・ 出来ればBテーブル(商品コード)を2つ作くったり等したくないのですが、SQLステートメントでどう記述すれば良いですか?      

  • こんなSQLを教えてください

    こんなSQLを教えてください <更新前> テーブル1 |キー|コード| | 1|  a| | 2|  b| | 3|  c| テーブル2 |キー|コード| | 2|  B| | 4|  D| <更新後> テーブル1 |キー|コード| | 1|  a| | 2|  B| | 3|  c| こんなふうに テーブル1と同じデータがテーブル2にあったら テーブル1を書き換えるUPDATE文を教えてください

  • SQLがわかりません。

    以下のTESTテーブルから以下の結果を表示するようなSQLを教えて頂けないでしょうか。 TESTテーブルでTYPE(1,2,3)を抽出して、2,1,3の順番にして それぞれのTYPEごとにDBIDでソートをしたいです。 どうかよろしくお願いいたします。 table TEST DBID | NAME | TYPE ------------------------------- 1 | A | 1 2 | B | 2 3 | C | 3 4 | D | 4 5 | E | 1 6 | F | 2 7 | G | 3 8 | H | 4 9 | I | 1 10 | J | 2 結果 DBID | NAME | TYPE ------------------------------- 2 | B | 2 6 | F | 2 10 | H | 2 1 | A | 1 5 | D | 1 9 | G | 1 3 | D | 3 7 | G | 3

  • アクセス2003 SQL2000を使用してます。

    いつもお世話になっています。 下記のようにAテーブルBテーブルを元に Cテーブルのようにデータを出力したいのですが、 SQL文がうかびません。 どなたか教えてください!! ●Aテーブル(取込データ)  名前  | コード1(主コード) -------------------------  小林  | 100   小林  | 102    田中  | 110   町田  | 130  木村  | 160  木村  | 160  木村  | 180 ●Bテーブル(取込データ) コード1 | コード2 ---------------------------  100   | A  110   | C   130   | D  160   | E ●Cテーブル(出力データ/ABテーブル合体させたもの) ★ ※※※を表示させたい!  ↓ここまでは表示はできている↓  名前  | コード1  | コード2 --------------------------------------------  小林  | 100    | A  小林  | 102    | ※※※  田中  | 110    | C   町田  | 130    | D  木村  | 160    | E  木村  | 160    | E  木村  | 180    | ※※※  ↓表示したい内容。不明な点。↓  名前  | コード1  | コード2 --------------------------------------------  小林  | 100    | A  小林  | 102    | A  田中  | 110    | C   町田  | 130    | D  木村  | 160    | E  木村  | 160    | E  木村  | 180    | E 以上 よろしく御願いします!!

  • SQLの質問です。

    SQLの質問です。 Access2003でのデータ操作で、 (1)2つのテーブルから一部列でのデータ重複があるものを除き、全件抽出 (2)テーブルは dテーブル No、販売先、日時、評価、金額 mテーブル 販売先(主キー)、店舗名 この二つのテーブルから全データを出力、ただし同じNoが重複しているデータは評価がA~Dのもの中で(E~F、空もある)日時が最新のもののみ出力をしたいのですが、教えていただけませんでしょうか、お願いします。

  • Oracle10gのSQL文についての質問です。

    Oracle10gのSQL文についての質問です。 [A]テーブルに CODE(key) NAME と、フィールドがあります。 A NAME-A B NAME-B C NAME-C D NAME-D E NAME-E と、データが入っています。 [B]テーブルに CODE(key) LINE(key) BIKO と、フィールドがあります。 A 1 BIKO-A-1 A 2 A 3 BIKO-A-3 B 1 B 2 B 3 C 1 C 2 BIKO-B-2 C 3 D 1 BIKO-D-1 D 2 BIKO-D-2 D 3 BIKO-D-3 E 1 E 2 E 3 BIKO-E-3 と、データが入っています。 結果が CODE(key) LINE(key) BIKO と、フィールドがあります。 A 1 BIKO-A-1 A 2 BIKO-A-1 A 3 BIKO-A-1 B 1 (null) B 2 (null) B 3 (null) C 1 BIKO-B-2 C 2 BIKO-B-2 C 3 BIKO-B-2 D 1 BIKO-D-1 D 2 BIKO-D-1 D 3 BIKO-D-1 E 1 BIKO-E-3 E 2 BIKO-E-3 E 3 BIKO-E-3 と、したいのです。 つまり、[B]テーブルのLINEが一番小さいBIKOが欲しいのです。 色々と考えてみましたが、解りません。 宜しくお願い致します。

  • SQL SELECT(Oracle 11g)

    SQLのご質問です(Oracle 11g)。 No 商品 1 A 1 B 1 C 2 A 3 A 3 D 4 E 【下記条件】 Aの商品が含まれている場合対象 また、BとCが混じっていても対象 その他の商品(AとBとC以外)が混じっていると非対象 結果 No 1,2が出力 とのSQLを作成したいのです。 条件が上手く浮かびません。 有識者の方ご享受宜しくお願い致します。

  • unionの結果は集計はできないですよね。。。。

    【明細データ】と【変換テーブル】で、変換後明細データを作成 して、その結果を集計したいのですが、、、 下記の結果を求めるためにはSQLひとつで可能でしょうか? ※(3)の表まではunionで可能でしたが、unionでは集計はできないですよね。。。。 (1)【明細データ】 CODE VALUE AMOUNT A 1000 10000 B 2000 20000 C 3000 30000 D 4000 40000 E 1001 10000 F 2001 20000 G 3000 30000 H 4000 40000 (2)【変換テーブル】 VALUE1 VALUE2 1000 1001 2000 2001 (3)【変換後明細データ】 CODE VALUE AMOUNT A 1001 10000 B 2001 20000 C 3000 30000 D 4000 40000 E 1001 10000 F 2001 20000 G 3000 30000 H 4000 40000 (4)【SQL抽出結果】が欲しい VALUE AMOUNT 1001 20000 2001 40000 3000 60000 4000 80000

  • 複雑なSQLを1本でまとめたい

    Oracle10gで開発をしています。 1本のSQLで下記のような結果を返したいのですが、 やり方がわかりません。 どなたかご教授頂けないでしょうか? Aテーブル No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 2   002   a001  5     5 3   003   b001  10    10 4   004   c001  5     2 5   005   d001  20    0 SELECT * FROM Aテーブル WHERE 在庫数 - 注文数 > 0 結果 No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 4   004   c001  5     2 5   005   d001  20    0 となりますが、 これを 結果 No  注文番号 品番 在庫数 注文数 -  ---- -- --- --- 1   001   a001  10    0 2   002   a001  5     5 4   004   c001  5     2 5   005   d001  20    0 という風に、1番目の結果+1番目の結果にある商品の 他レコードも抽出したいのですが、どうしたらよいでしょうか?

専門家に質問してみよう