• 締切済み

sqlでNOT INでテーブルの値を比較

yumi-accessの回答

回答No.2

最近oracleから離れているからわからないですが 一般的にこんなJOINで出来そうですが如何でしょうか? select A.ID, A.NUM, A.TNNO from tbl as A inner join tbl as B on B.ID = A.ID and B.TNNO != A.TNNO order by A.ID, A.NUM, A.TNNO

abc999xyz
質問者

お礼

ありがとうございます。 ID NUM TNNO A 001 TN01 A 002 PC01 A 002 PC01 A 003 TN01 B 001 TNPC01 B 002 TN01 という結果になりました。 A 002 PC01 が重複します。 たぶん、NUMが「001と003」で抽出されているかかと

関連するQ&A

  • NOT EXITSを用いたデータ抽出

    以下の様のテーブル内容でb_tblにないa_tblのデータを抽出するにはNOT EXITSを使用したSQLはどの様に記述すればよいでしょうか。尚、NOT INでは以下の様な記載になりますが、これを単純にNOT EXITSに置き換えると同様の結果が得られません。 select distinct a from a_tbl where a not in (select a from b_tbl); a_tblの内容 項目a 10001 10001 11001 12002 13003 13003 13003 14004 14004 15005 15005 16006 16006 16006 17007 18008 18008 18008 b_tblの内容 項目a 10001 11001 13003 15005 17007 結果 12002 14004 16006 18008

  • 巨大テーブルの外部結合

    巨大なテーブル同士を結合する際に、みなさんはどのように結合されますか?もっともパフォーマンスのある方法を模索しているところです。 テーブルA:約900万件 テーブルB:約400万件 テーブルAのインデックスはカラム:idです。 テーブルBにはインデックスはありません。 取得したいのはBテーブルに含まれるAテーブルのidの件数です。 select  count(id) from B where A.id = B.id なんてやると、数時間かかります。 select count(id) from B where exists(select * from A where A.id = B.id) ですと、約3hぐらいかかりました。 inで実行すると等価結合したときと変わらないぐらいになります。 こういう場合、皆さんはどう結合されていますか? お知恵を拝借できると幸いです。 ちなみにoracle 8iです。 よろしくお願いいたします。

  • ACCESSのSQLの書き方

    ACCESSでのSQL文の書き方を教えてください。 テーブルtbl_Aとテーブルtbl_Bがあり, tbl_Aで得られた数値とtbl_Bで得られた数値を加えたものを結果として表示します。 どう書けばよろしいのでしょうか。どうしてもエラーになってしまいます。 イメージとしてはこんな感じです。 select (select ~~ from tbl_A where ~~)+(select ~~ from tbl_B where ~~) (もしoracleならば,「from dual」というのを最後に付けるんですが。)

  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。

  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???

  • シンプルなSQLの書き方がわかりません。

    以下のSQLをシンプルに一つにしたいのですが、どのように書いたらよろしいでしょうか? どうぞご返答頂けますようお願い申し上げます。 --test1_tblの抽出 select a1 as a1, b1 as b1 from a_tbl where c=1 --test2_tblの抽出 select a1 as a1, e1 as e1 from b_tbl where rowid in (select min(rowid) from ee group by a1) and a1 is not null and a1 !=' ' order by a1 --test1_tblとtest2tblの結合 select t0.a1 as a1, t0.b1 as b1, t1.e1 as e1 FROM test1_tbl t0, test2_tbl t1 WHERE (t0.a1 = t1.a1)

  • SQL サブクエリで抽出したカラムについて

    サブクエリで抽出したカラムを 本クエリでの結果と一緒に表示したいのですが どのように実現してよいかわからず困っております。 詳細としては、下記のようなことをしたいと考えております。 文中の1)と2)は文章下部にあるSQLを指しております ----------------------------------------------------------- 最初は、1)のように凄く単純なSQLでよかったのですが 仕様が変わり、TBL2で取得した新しいカラムも一緒に 本クエリでの結果として取得できれば、SQLを2回実行せずに済むなと考えたのですが、 2)のように色々と試行錯誤したのですが、実現できません。 (2)は単なる空想ですが…) そこで、わかる方にお伺いしたいのですが、 副問い合わせで取得した複数カラムの中の1つのカラム【2)でいうところのTBL2.X】 を 2)のように"select TBL1.A , TBL2.X"として、結果を得ることは可能でしょうか。 ただし、 TBL1のカラムAは、TBL2に存在しない TBL2のカラムXは、TBL1には存在しない カラムBは、TBL1、TBL2に存在する の条件となっております 環境はMysqlです テーブル結合の方法も考えたのですが、 TBL2で、日付でソートし、その上位100件だけを 持ってきたいと思ったので、副問い合わせで一気に抽出しようとこの方法を考えまし た お分かりになる方がいらっしゃいましたらよろしくお願いします 1)SQL ------------ select TBL1.A from TBL1 where TBL1.B in ( select TBL2.B from TBL2 where 条件 ) 2)想像SQL(こんな感じの事をしたい) -------------- select TBL1.A , TBL2.X from TBL1 where TBL1.B in ( select TBL2.B , TBL2.X from TBL2 where 条件 order by TBL2.日付 desc limit 100 )

    • ベストアンサー
    • MySQL
  • NOT INをNOT EXISTSで書き直したい

    こんにちは。SQLでNOT INが実行速度が遅いため、EXISTSで書き直したいのですが、思っている結果がでません。 SQLのどこが間違っているかお教え頂けませんでしょうか? ■ ・テーブル名:R_TABLE ・フィールド:id データ: id(ユニークではない) 001 002 003 003 003 007 008 009 ■ ・テーブル名:P_Master ・フィールド:id データ: id(ユニーク) 001 002 003 ■やりたい事 R_TABLEのデータを条件によって削除したい。 条件はP_MASTERに無いR_TABLEの行を削除したいです。 ■欲しい結果 R_TABLE 001 002 003 003 003 ■書いたSQL DELETE FROM R_TABLE WHERE R_TABLE.id NOT IN (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) これは正しい結果がでました。 書きなおしたSQL DELETE FROM R_TABLE WHERE R_TABLE.id WHERE NOT EXISTS (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) 結果はR_TABLEから何も消されていませんでした。 どこを修正すれば正しい結果が得られるでしょうか? 副問い合わせで、R_TABLEとP_MASTERのINNER JOINの結果が得られ、R_TABLEからINNER JOINに含まれないデータ削除しろという命令だと思っていたのですが違うみたいです。 どこを修正すればよろしいでしょうか? よろしくお願いします。

  • IN( )の中に、項目をたくさん入れたら処理が重くなってしまう

    MySQLで↓このような、処理をしたいんですが select TABLE_A.* from TABLE_A where TABLE_A.id in (select TABLE_B.TABLE_A_ID from TABLE_B ) このように、INの中にサブクエリを入れてるんですが、 ものすごく重くなってしまい、検索されるまでに通常の数倍かかってしまいます。 サブクエリの該当件数は30件ほどで、これからも増えて行く予定です。 サブクエリ発行部分を in (1,2,3…29,30)と 生書きしても、やや重く、どうやら、inの中に項目を やたらたくさん入れると重くなるみたいです。 このようなINの項目が無数に増えても、 処理をより軽くするには、どうすればいいのでしょうか?

    • ベストアンサー
    • MySQL
  • テーブル上に存在しないデータの一覧を取りたい。

    mysql+phpで開発を行っています。 テーブル id 101 102 104 106 109 110 の様にデータが入っているテーブルaaaがあります。 プログラムで取得したid一覧が上記テーブルにレコードがあるのか確認するSQLは 例)select id from aaa where id in (101,102) で取得できるということは分かっています。 ここで select id from aaa where id in (102,103) とやると102の1件が取得できます。 今回知りたいことは 逆に取得できなかった103という値を取得する方法はないのかという事です。 select id from aaa where id=102; select id from aaa where id=103; 2回SQLを実行して値が戻ってこないSQL=テーブルにそのレコードが無いというプログラムを書けばいい事は分かっています。 しかし、処理が少なくとも数千回発生してしまう予定ですのでできれば別の方法がいいと思っています。 また、in区で使っている一覧はテーブルには入っておらず、また、こちらも数千個あるので、一時テーブルに入れるといってもかなりの時間がかかってしまうと思います。 何か一発で取得できるいい方法などありますでしょうか? ちなみにaaaテーブルは5万件ほどなので全件php側でメモリに展開してサーチも避けたいです よろしくお願いいたします。