- ベストアンサー
SQL server:SELECT文について
SQL serverにてデータの管理をしてます。SELECT文について質問なのですが、 例えば、取引先データが入っているテーブルを「A_取引先」とします。 また、ここ何年かの売上データが入っているテーブルを「B_売上」とします。 今回、取引先整理のため売上データ(B_売上)にない取引先を取引先データ(A_取引先)から抽出したいのですが、どのように書けばよいでしょうか not inを使っても「B_売上」にまったくない取引先は抽出されません。 分かりにくい文章かもしれませんが、ご教授の程よろしくお願い致します。
- regulus0725
- お礼率86% (26/30)
- SQL Server
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>not inを使っても「B_売上」にまったくない取引先は抽出されません。 どういうSQLを書いているのかが分かりませんので何とも言えませんが、 not in でも抽出できると思いますよ。 もしくは not exists を使って select 取引先 from A_取引先 where not exists ( select * from B_売上 where A_取引先.取引先ID = B_売上.取引先ID); こんな感じもいいと思います。
その他の回答 (2)
- nora1962
- ベストアンサー率60% (431/717)
SELECT A_取引先.* FROM A_取引先 WHERE NOT EXISTS ( SELECT 1 FROM B_売上 WHERE A_取引先.取引先CD=B_売上.取引先CD) なんてのもあります。 B_売上.取引先CDにINDEXがあればかなり高速です。
お礼
分かりづらい質問の中、回答を頂きありがとうございました。 existsで無事解決出来ました。
- t_ohta
- ベストアンサー率38% (5080/13275)
A_取引先 と B_売上のリレーションキーを「取引先名」と仮定して select 取引先名 from A_取引先 left outer join (select 取引先名, count(*) as 取引回数 from B_売上 group by 取引先名) 取引履歴 on A_取引先.取引先名 = 取引履歴.取引先名 where 取引履歴.取引回数 = 0; といった感じじゃないでしょうか。
お礼
分かりづらい文章の中、回答して頂きありがとうございました。 無事解決出来ました。
関連するQ&A
- SQL(SELECT文)を教えてください
SQL Serverを勉強中です。 以下のようなテーブルに、同一の日付に複数の名称・値のセットが存在します。 Date(日付) Name(名称) Value(値) 20130101 a 10 20130101 b 20 20130101 c 30 20130202 a 5 20130202 b 10 20130202 c 15 このデータを、SQLのSELECT文で取得し、以下のような表を作りたいと考えています。 a b c 20130101 10 20 30 20130202 5 10 15 行が日付、列が名称になっています。 このように取得できるSQL文を教えてください。よろしくお願いします。
- ベストアンサー
- SQL Server
- 【SQL】SELECT文
こんにちは。OracleのSQLを勉強中の者です。 SELECT文について質問させてください。 下記のテーブルから購入フラグがすべて「1」のユーザ名を抽出したいのですが、SQL文をご教授いただけますでしょうか。 テーブル名:商品購入テーブル ユーザ名 商品名 購入フラグ ---------- ---------- -------------- 001 AAA 1 001 BBB 1 001 CCC 0 002 DDD 1 003 AAA 1 003 EEE 1 004 CCC 0 このテーブルからですと、002と003のユーザが抽出される形となります。 以上、よろしくお願いいたします。
- ベストアンサー
- Oracle
- SQL Server を使っています。SQLの質問です。
SQL Server を使っています。SQLの質問です。 得意先テーブルと商品テーブルと売上明細テーブルがあります。 一つの商品に関して得意先ごとに最新の売上明細データの一覧を作成したいと考えて います。 ■売上明細データ 明細ID (meisai_id) 得意先ID (tokuisaki_id) 商品ID (syohin_id) 売上金額(uriage_kingaku) 売上日 (uriage_date) ■売上明細データ(table_uri_maisai) meisai_id tokuisaki_id syohin_id uriage_kingaku uriage_date ================================================================= 1 aaa 001 100 2010/01/01 2 aaa 002 200 2010/01/01 3 bbb 001 105 2010/01/02 4 bbb 002 205 2010/01/02 5 ccc 001 110 2010/01/03 6 ccc 002 210 2010/01/03 7 aaa 001 100 2010/01/04 8 aaa 002 200 2010/01/04 9 bbb 001 105 2010/01/05 10 bbb 002 205 2010/01/05 11 ccc 001 110 2010/01/06 12 ccc 002 210 2010/01/06 上のような明細があり、「syohin_id」が「001」のデータに関して、 得意先ごとの最新のデータだけを抽出したいと考えています。 この場合ですと、以下の3件のデータが抽出できればよいわけです。 7 aaa 001 100 2010/01/04 9 bbb 001 105 2010/01/05 11 ccc 001 110 2010/01/06 tokuisaki_id と syohin_id の2つを特定して1件のデータを抽出するには 以下のSQLで実現できましたが、syohin_id だけを指定して複数のデータを 出すことがどうしてもできません。 SELECT * FROM table_uri_meisai WHERE uriage_date = (select max(uriage_date) FROM table_uri_meisai WHERE tokuisaki_id = 1 AND syohin_id = 1) AND tokuisaki_id = 1 AND syohin_id = 1 どなたかご指導ください。 よろしくお願いします。
- ベストアンサー
- SQL Server
- SQL文 特定のレコードを抽出したい
以下のようなテーブルAがあったとします。 年月日,項目B ---------------------- 20080101 100 20080102 100 20080103 200 20080104 400 20080105 400 20080106 200 SQL文にて、データの抽出を行いたいのですが、 抽出したいのは、データに変更があった年月日と項目Bの値です。 年月日,項目B ---------------------- 20080101 100 20080103 200 20080104 400 20080106 200 前の年月日と比較し、項目Bに違いがあった場合のデータだけ抽出したいのですが、SQL文で行うことは可能でしょうか?? 環境は、SQL Server 2005 です。
- ベストアンサー
- Microsoft ASP
- 【初歩的な質問ですが・・・】 SQL文書き方がわかりません
SQLの知識に乏しい者です。 よろしくお願い致します。 ●テーブルA ・会計コード ・年度 ・部署番号 ・社員番号 ・その他幾つかのデータ ※Where句で「年度>2002年」以降を抽出 のテーブルがあります。 この時、Bテーブルで ●テーブルB ・会計コード(主キー) ・年度 ・部署番号(主キー) ・社員番号(主キー) ・その他幾つかのデータ ※Aテーブルで抽出されたデータの中から絞り込む というテーブルを抽出するSQL文を組みたいのですが、効率の良いやり方がわかりません。 副問合せで Select [B表で抽出した列名…] From B表 Where 会計コード = (Select 会計コード From A表 Where 年度 > '2002') AND 部署番号 = (Select 部署番号 From A表 Where 年度 > '2002') ・・・・以下省略 の様に書くと効率が悪い気がしました。 (実際には、副問合せが6個書くことになるため) 良い書き方を知っている方がいらっしゃいましたら、よろしくお願い致します。
- ベストアンサー
- Oracle
- データがあれば○○なければのSQL
基本的なことなのかもしれませんが・・・ AとBというテーブルがあり、あるタイミングでAを元にBを作成します。つまりBはデータがある場合とない場合があります。また、2つは関連番号で紐づいています。 Aテーブルを抽出したい時に、抽出条件は以下です。 ・Bテーブルのステータスが1であれば抽出 ・Bテーブルのステータスが0であれば非抽出 ・Bテーブルにデータがなければ抽出 INNER JOINだとデータがない時に抽出できないし、 WHERE句にCASE句を入れればいいのかなと思いましたが、テーブルにデータがあればなんて条件書けないしで詰まりました。 SELECTした結果に対して条件つけて抽出する手も思いつきましたが もっと美しいSQLがあれば教えてもらえないでしょうか。 環境はSQLServerです。よろしくお願いします。
- 締切済み
- その他(プログラミング・開発)
- このSQL文の意味を教えてください。
SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。
- ベストアンサー
- その他(データベース)
- 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 (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。
- ベストアンサー
- その他(プログラミング・開発)
- SQL文で
SQL2000serverで 異なる2つのデーターベースの中にある 別のテーブルの情報を SQL文を使って、抽出する事は出来るのでしょうか? たとえば下記のように「DB-A」「DB-B」と言った 二つのDBの中のそれぞれのテーブルのIDフィールドで リレーションを取ってDB-AのTablA1のFldAの 値(AA)からDB-BのTablB1のFldBの値(あ)を 抽出することはSQL文で可能なのでしょうか? DB-A DB-B TablA1 TableB1 ID FldA ID FldB 1 AA 1 あ 2 BB 2 い 3 CC 3 う 4 DD 4 え
- ベストアンサー
- SQL Server
お礼
構文のなく分かりづらい質問の中、回答して頂きありがとうございました。 existsで解決出来ました。 exists中のwhere以降が間違っていたみたいです。