- ベストアンサー
SQLServer2005 外部結合のソース
- SQLServer2005を使用して、テーブルAの中でテーブルBを含まないデータを抜き出す方法について教えてください。
- 具体的なテーブルの例を挙げながら、テーブルAの中でテーブルBと一致しないデータの抽出結果を示してください。
- プログラムを使用して、テーブルAの中でテーブルBの名前と番号が一致しないデータを抽出する方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
関連するQ&A
- 外部結合について
こんばんは。 SQLでの外部結合について教えてください。(オラクルの場合です) データを取得しいテーブルが4つあったとします。 Aテーブルのキーは、「ユーザーID」と「名前」と「住所」だとします。 Bテーブルのキーは、「名前」と「郵便番号」とします。 Cテーブルのキーは、「名前」と「郵便番号」とします。 取得したいデータは、全てのテーブルに存在しています。 Aテーブルに対してBテーブルとCテーブルを外部結合したいと思っています。 Aテーブルには「ユーザーID」があります。 Bテーブルからは、「給料」データが取得したいのです。 Cテーブルからは、「年齢」データが取得したいのです。 B,Cのテーブルに条件に合致するものがなくても、AのユーザーIDだけは 表示したいと思っています。 自分なりに考えて色々試したのですが、うまく行かず構文でエラーになります。 どうしてもAテーブルに外部結合したいです。 SELECT A.ユーザーID, B.給料, C.年齢 FROM A, B, C WHERE A.ユーザーID = ’XXXXX’, A.名前 = ’AAAAAA’, A.住所 = ’KKKKKKKKKKK’, A.名前(+) = B.名前, A.名前(+) = C.名前, A.郵便番号(+) = B.郵便番号, A.郵便番号(+) = C.郵便番号 このように考えたのですが,「すでに1つの表と外部結合されています」みたいに エラーがでてしまいます。 どのように修正すれば、よいのでしょうか? よろしくお願い致します。 ※全角になっているなどは、見やすくする為にやっています。
- ベストアンサー
- その他(データベース)
- オラクルの外部結合について
仮にテーブル類をこのように設定します テーブル 項目 ------------------- マスタ111...a,b,c,d,e マスタ222...f,g,h,i,j ------------------- ※ マスタ111とマスタ222のKEYは(a = f,b = g)とします。 SQLの抽出にて、a~jまでの全ての項目をマスタ111 に存在する全てのデータのみ抽出したい (マスタ222に紐つくデータがない場合はf~j項目は空白として抽出) と思い、以下のような下のようなSQLとしてみましたが、これだとマスタ222に紐つくデータがない場合は抽出の対象外となってしまいました。 -------------------------- SELECT A.a A.b A.c A.d A.e B.f B.g B.h B.i B.j FROM マスタ111 A,マスタ222 B WHERE A.a = B.f(+) AND A.b = B.g(+) -------------------------- マスタ222に紐つくデータがないマスタ111のデータも抽出したい場合は、どのようなSQLにしたら良いでしょうか? 宜しくご教授下さい。お願い致します。
- ベストアンサー
- Oracle
- SQLServerの仕様?バグ?
以下のデータ、条件でクエリを発行しました。 ■環境 SQLServer2005(データベースはSQLServer2000) ■テーブルA 社員番号 社員名 商品 金額 ---------------------------- 00001 社員A 商品A 100 00002 社員B 商品A 100 00002 社員B 商品B 100 00003 社員C 商品B 100 ■クエリ SELECT COUNT(*) FROM テーブルA WHERE 社員番号 = (1) GROUP BY 社員番号 ここで質問です。 (1)に'0002'と入れたときは「2」と返ってきますが、 (1)に'0004'と入れた場合、結果何も返ってこない(ゼロすら返ってこない)のですが これは仕様なのでしょうか?バグなのでしょうか? そもそもGROUP BYが必要ないということは承知しております。 どなたかお分かりになる方、いらっしゃいますでしょうか。 よろしくお願い致します。
- ベストアンサー
- SQL Server
- MySQL区切った文字列で外部結合はできない?
MySQLの外部結合について教えてください 「結合の対象となっているカラムの値が一致」は必須なのでしょうか? ■やりたいこと ・Aテーブルaカラム内にある「デリミタの先頭文字列」を抽出して、Bテーブルのidカラムと結合したい ■最終的にやりたいこと ・上記一致条件で、両テーブルデータをSELECTしたい ■試したこと ・「SELECT SUBSTRING_INDEX」で「デリミタの先頭文字列」を抽出できたのですが、そこで行き詰まりました ■質問 ・そもそもやろうとしていることが無謀なのでしょうか? ・テーブル構成を見直した方が良いのでしょうか?
- ベストアンサー
- MySQL
- データがあれば○○なければのSQL
基本的なことなのかもしれませんが・・・ AとBというテーブルがあり、あるタイミングでAを元にBを作成します。つまりBはデータがある場合とない場合があります。また、2つは関連番号で紐づいています。 Aテーブルを抽出したい時に、抽出条件は以下です。 ・Bテーブルのステータスが1であれば抽出 ・Bテーブルのステータスが0であれば非抽出 ・Bテーブルにデータがなければ抽出 INNER JOINだとデータがない時に抽出できないし、 WHERE句にCASE句を入れればいいのかなと思いましたが、テーブルにデータがあればなんて条件書けないしで詰まりました。 SELECTした結果に対して条件つけて抽出する手も思いつきましたが もっと美しいSQLがあれば教えてもらえないでしょうか。 環境はSQLServerです。よろしくお願いします。
- 締切済み
- その他(プログラミング・開発)
- ACCESSクエリでの結合の仕方・・・SQL文かも
ACCESS 2003を使用しています。 テーブルA テーブルB の2テーブルでクエリを作っています。 結合的には・・・ テーブルAのフィールドX ⇔ テーブルBのフィールドY です。 これで2テーブルに共通する一致データのみ抽出はできるのですが、 2テーブルに共通する一致データに加えて、 2テーブルの不一致データも一緒にクエリ表示されるようにしたいのです。 欲しいのは抽出イメージは、以下のような感じのクエリ結果です。 テーブルA:フィールドX|テーブルBのフィールドY a |(空) (空) |b c |c d |(空) (空) |e f |f g |(空) h |h おそらく、SQL文を書く必要があるとは、想像できるのですが・・・ どなたか、ご教授いただけると助かります。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- 外部結合について
外部結合というのは、表と表を結合するという事で FROM句に書くべきことと思うのですが、 なぜWHERE句(カラム毎に指定)で指定するのでしょうか? 例えば、 テーブルA No|Kind|Name| ------------- 1|1 |A | 1|2 |B | 2|1 |C | 2|2 |D | テーブルB No|Kind|Data| ------------- 1|1 |10| 外部結合で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind(+) とすると No|Kind|Name|Data| ------------------ 1|1 |A |10| 1|2 |B |NULL| 2|1 |C |NULL| 2|2 |D |NULL| となります。 A.NoがB.NoになくてもOKで、Kindは 完全に一致しないとだめという意味で SELECT A.No, A.Kind, A.Name, B.Data FROM A,B WHERE A.No = B.No(+) AND A.Kind = B.Kind とした場合、 No|Kind|Name|Data| ------------------ 1|1 |A |10| 2|1 |C |NULL| となるのであれば納得いくのですが、 結果は↓なるようです。 No|Kind|Name|Data| -------------------------- 1|1 |A |10| (+)を一つも付けてない場合と 同じ動作になるようです。 テーブルAとテーブルBを結合するとき、 「外部結合する場合はWHERE句で指定する選択の条件全てに(+)を付ける」 「外部結合をしない場合はWHERE句で指定する選択の条件全てに(+)を付けない」 であれば、カラム毎に外部結合演算子を指定する意味が無いと思うのですが。 どなたか、カラム毎に外部結合演算子を指定する意味をご教授下さい。 宜しくお願いします。
- ベストアンサー
- Oracle
- 最新レコードを抽出し外部結合する方法について
お世話になります。 現在、最新レコードを抽出し外部結合するSQLを考えているのですが、実現できておりません。 実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。 # 私の使用しているのは、PostgreSQL8.3となります。 実現したい内容は、以下となります。 1.テーブルAから「名前」でグループ化して最新の「更新日付」のレコードを抽出。 2.1の結果とテーブルBを「名前」で結合。 3.テーブルAの「名前」、「点数」、「更新日付」とテーブルBの「判定」を抽出。 ⇒ただしテーブルAに情報がある場合は、テーブルBの判定結果を「0」にして出力。 テーブルA テーブルB ---------------------------- ----------------------- 名前| 点数| 更新日付 名前 | 判定 ---------------------------- ----------------------- AAA 98 2011/4/1 AAA 0 AAA 60 2011/4/3 BBB 1 BBB 70 2011/4/2 CCC 1 BBB 35 2011/4/4 DDD 1 DDD 98 2011/4/1 EEE 0 EEE 47 2011/4/5 FFF 0 GGG 80 2011/4/6 GGG 1 【出力結果】 --------------------------------------------- 名前 | 点数 | 更新日付 | 判定 --------------------------------------------- AAA 60 2011/4/3 0 BBB 35 2011/4/4 0(1⇒0に変更) CCC NULL NULL 1 DDD 98 2011/4/1 0(1⇒0に変更) EEE 47 2011/4/5 0 FFF NULL NULL 0 GGG 80 2011/4/6 0(1⇒0に変更) お手数お掛け致しますが、ご教示のほどよろしくお願い致します。
- ベストアンサー
- PostgreSQL
- left joinなどで結合対象のレコードから1件だけ得る方法は
テーブル1 番号(ユニーク) その他のデータ 1 データ 2 データ 3 データ ... テーブル2 番号 名前 その他のデータ 1 名前A データ 1 名前A データ 2 名前B データ 3 名前C データ 3 名前C データ ... を、結合を使って 1 名前A テーブル1のデータ 2 名前B テーブル1のデータ 3 名前C テーブル1のデータ ...というようにしたいのですが、group by をつかわないで得る方法はありますか?(対象テーブルから1件だけ結合したい。) たとえば、複数の結合をこのようにした時、if()の中のカウントが、他の結合の影響を受けてしまいます。 select a.*,b.名前,if(count(c.番号) > 1,"複数",c.名前) from テーブル1 a left join テーブル2 b on b.番号 = a.番号 left join テーブル3 c on c.番号 = a.番号 group by a.番号,b.番号,c.番号 わかりづらい質問ですみません。
- 締切済み
- MySQL
- SQLでデータを抽出する方法
テーブルAとテーブルBがあり、AとBには「項目番号」と言うフィー ルドがそれぞれある。 この時、Aの「項目番号」とBの「項目番号」が一致しないデータを 抽出したい。 例: A:番号,名称 1 ,あ 2 ,い 3 ,う B:番号 1 4 5 この場合、抽出したいデータは、 番号 2 ,い 3 ,う なのですが、どうしても、 1 ,あ 1 ,あ 2 ,い 2 ,い 2 ,い 3 ,う 3 ,う 3 ,う となってしまいます。 どうしたら良いか教えてください。 よろしくお願いします。
- ベストアンサー
- その他(データベース)
お礼
計算できました 参考URLも初心者の私にとって、とても勉強になりそうです。 回答有難うございました。