- ベストアンサー
JOINの方法について
毎度お世話になっております。 以下のテーブル1、テーブル2があります。 [テーブル1] CODE 1月 2月 A 10 10 C 30 30 [テーブル2] CODE 3月 4月 A 10 10 B 20 20 D 40 40 これを以下のようにくっつけたいのです。 [希望する結果] CODE 1月 2月 3月 4月 A 10 10 10 10 B 20 20 C 30 30 D 40 40 クエリ1(テーブル1 LEFT JOIN テーブル2とする)と、 クエリ2(テーブル2 LEFT JOIN テーブル1とする)を作り、 UNIONでくっつける方法を考え、希望した結果は得られましたが、 もっとスマートな方法(一つのクエリでできるような方法)が あればご教授ください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- keirika
- ベストアンサー率42% (279/658)
- CHRONOS_0
- ベストアンサー率54% (457/838)
- chukenkenkou
- ベストアンサー率43% (833/1926)
関連するQ&A
- JOIN 句の書き方について
毎度お世話になっております。 以下のテーブルの内容があります。 ・テーブル1 フィールド1 a ・テーブル2 フィールド1 親 子 孫 1 a なし なし 2 なし a なし 3 なし なし a 4 なし なし なし ここで、テーブル1.フィールド1の内容を含む テーブル2の行を抽出したいのです。 ・希望する結果 フィールド1 親 子 孫 1 a なし なし 2 なし a なし 3 なし なし a 以下のSQL文を作成したところ希望する結果になりましたが、 ONの中にORを書いてもよいのでしょうか。 それともUNIONクエリにすべきなのでしょうか。 SELECT テーブル2.フィールド1, テーブル2.親, テーブル2.子, テーブル2.孫 FROM テーブル1 LEFT JOIN テーブル2 ON (テーブル1.フィールド1 = テーブル2.孫) OR (テーブル1.フィールド1 = テーブル2.子) OR (テーブル1.フィールド1 = テーブル2.親); よろしくお願いします。
- ベストアンサー
- その他(データベース)
- どちらのLEFT JOINが早いでしょうか?
下記2つのテーブルがあったとします。 ・大テーブルA 7000万件 ・小テーブルB 2000件(※現在はWHERE句で指定すると1件) をJOINする場合、下記のどちらの方法が望ましいでしょうか? 案1)子テーブルを親とする方法 テーブルA(ON句により1件~2000件) LEFT JOIN 7000万件のテーブルB 案2)親テーブルを子とする方法 7000万件のテーブルB LEFT JOIN テーブルA(ON句により1件~2000件) 又、LEFT JOINの、ON句で条件を絞るのと、 WHERE句で条件を絞るのではどちらが好ましいでしょうか?
- ベストアンサー
- MySQL
- ACCESS クエリでの抽出の方法について
毎度お世話になっております。 ACCESS2003、SQLSERVER2000を使用しています。 以下のテーブルがあります。 テーブル1 フィールド1 フィールド2 A 10 A 20 A -10 B 1 B 2 B 3 フィールド1をグループ化し、 フィールド2に0より小さい数がある場合はNG、 ない場合はOKと表示したいのです。 希望する結果 フィールド1 フィールド2 A NG B OK 私が考えた方法は、 1.クエリ1(フィールド2が0以下のフィールド1を抽出する)を作成 2.テーブル1とクエリ1をLEFT JOINし、IS NULL ならOK、そうでないならNGを表示 としました。希望した結果は得られましたが、 もっとスマートな方法(一つのクエリでできるような方法)、 または別解をご教授ください。 よろしくお願いします。
- ベストアンサー
- SQL Server
- joinの入れ子について
A(contenthead)をベースにAがBに存在せずかつCに存在しないデータをを作りたいのですが上手く行きません。以下を実行すると SELECT a.contentid, b.contentid, d.contentid From (contenthead as a LEFT JOIN group as b on a.contentid = b.contentid) left join (contenthead as c LEFT JOIN ouser as d on c.contentid = d.contentid) on a.contentid = c.contentid 表示結果は 1、1、NULL 2、NULL、Null 3、NULL、3 4、NUL、4 と出て来ます。従って両方にないのは2だけということになります。 実際のデータもそうなっています。 そこで、 WHERE ((b. contentid) is null) and ((d. contentid) is null)を上記SQLに付加するとなぜか 2、NULL、Null 3、NULL、null 4、NUL、NULL と表示されます。 教えて頂きたいことお分かり戴けますでしょうか宜しく御願い致します。
- ベストアンサー
- MySQL
- OUTER JOIN と TOP10との組み合わせ
LEFT OUTER JOIN と TOP10との組み合わせ テーブルAと LEFT OUTER JOIN するテーブルBがあり、 単にLEFT OUTER JOINすると、 レコードA01 レコードB01 レコードA01 レコードB02 レコードA01 レコードB03 のようにレコードBに対し、該当する同じレコードAが複数取得されます。 この状態でTOP10をかけると、テーブルAのTOP10が欲しいのに、 テーブルBも混じった数で取得されてしまいます。 (テーブルAは10レコード取得できない) これをテーブルAのTOP10を取得して、それにJOINするテーブルBの数は問わない方法は可能でしょうか?
- ベストアンサー
- SQL Server
- inner join left joinについて
inner join left joinの動きについては 理解しているつもりなのですが どういったテーブルの時innerにして どんなテーブルの時left joinにするかが わかりません inner join left join の選択方法 ※どっちを使えばよいかの見極め方について 教えて下さい
- ベストアンサー
- SE・インフラ・Webエンジニア
- Doctrineのjoinについて
symfony+Doctrineで開発をしています。 他のプログラムは経験があるもののPHP初心者です。 2つのテーブルをjoinして、両テーブルの結果を取得します。 where句の条件どおりに行数を得られているので、 joinはできていると思います。 でも、結果を取得することが出来ません・・。 具体的には、joinしたテーブル(BTable)のカラムを取得しようとすると、 「Unknown record property / related component "value" on "ATable"」というエラーが出てしまいます。 (ATableにはvalueなんてないよ、って言っているみたいですが) ●ソースはこんな感じ $query = Doctrine_Query::create() ->select('a.name, b.value') ->from('ATable a') ->innerJoin('a.Btable b') ->where('b.id = ?', $id); $list=$query->execute(); foreach($list as $xxx){ print_r($xxx['name']); print_r($xxx['value']);←ここでエラー } ●エラーメッセージ Unknown record property / related component "value" on "ATable" そこで質問させてください。 ・xxx['value']の箇所は、どのように記述すればいいのでしょうか? ・もしくは、Doctrineではjoinしたテーブルの値は取得できないのでしょうか? (webでいろいろ調べましたが、joinの例はあるものの、select結果を使う、といった例が見つかりませんでした・・) 方法がないのであれば、 あらかじめテーブルをjoinしたviewを作って、 それをselectするようにしようと思っています。 symfony+Doctrineに詳しい方がいらっしゃたら、 よろしくおねがいします。
- ベストアンサー
- PHP
- Accessクエリの、JOINの数の限界について
トランザクション系の大きなテーブルAに対し、多数のコード系テーブル(コードに対する名称を格納してあるテーブル)をJOINしてクエリを作っています。 テーブルAの大きさは、約200項目*約1000行程度です。 テーブルAに対し、次々にコード系テーブルをJOINしていっていたのですが、コード系のテーブルが19個になった途端にクエリが反応しなくなりました。 18個目までは、クエリを実行し、通常通りデータを参照することができるのですが、19個になった途端、クエリが反応しなくなってしまいました。具体的には、クエリのアイコンをダブルクリックした時点で固まったようになり、反応しなくなりました。30分ほど放っておいたのですが反応はないままでした。 なお、このクエリに使っているテーブルはイントラネットで繋がっているサーバのOracleDBからリンクしているテーブルです。そのため、通常、クエリを実行するとOracleへのログインダイアログが表示されるのですが、上記のコード系テーブル19個をJOINして実行した際には、このログインダイアログも表示されませんでした。このことから、反応がないのは性能的な問題ではなく、何らかの制限がかかっているのではないかと疑っています。 Accessのクエリには、JOINするテーブル数に上限があるのでしょうか。
- ベストアンサー
- Access(アクセス)
- LEFT JOIN とRIGHT JOINの合体版のような結合方法。
LEFT JOIN とRIGHT JOINの合体版のような結合方法。 使用DBはMySQL5.0.45です。 2つのテーブルの結合方式で、結合条件に合致しなかった場合、 両方のデータを結果セットに含めることはできますか? LEFT JOINだと、左側のテーブルのデータは結果に返ってきて、右側のデータはNULLになります。 RIGHT JOINだと、右側のテーブルのデータは結果に返ってきて、左側のデータはNULLになります。 これを「左側データあり右側NULL」「左側NULL右側データあり」というレコードを混ぜて結果として返したいです。 具体的には、 以下二つのテーブルがあるとします。 table : test1 value id ------------------- ああ 3 いい 4 うう 5 table : test2 value id -------------------- AAA 1 BBB 2 CCC 3 DDD 4 id を結合条件のキーとして、以下のような結果を得たいです。 NULL NULL AAA 1 NULL NULL BBB 2 ああ 3 CCC 3 いい 4 DDD 4 うう 5 NULL NULL LEFT JOINだと以下の結果に、 SELECT * FROM test1 LEFT JOIN test2 ON test1.id=test2.id ああ 3 CCC 3 いい 4 DDD 4 うう 5 NULL NULL RIGHT JOINだと以下の結果になってしまいます。 SELECT * FROM test1 RIGHT JOIN test2 ON test1.id=test2.id NULL NULL AAA 1 NULL NULL BBB 2 ああ 3 CCC 3 いい 4 DDD 4 以上、ご教示お願い致します。
- ベストアンサー
- MySQL
- クエリで2つずつ取り出す方法について
毎度お世話になっております。 WindowsXP、Access2003を使用しております。 以下のテーブル1があります。 [テーブル1] CODE 日付 A 20080101 A 20080102 A 20080103 B 20080101 C 20080101 C 20080103 C 20080104 CODEごとに、日付の若いものから2行ずつ、 1つしかないものは1行のみ抽出したいのです。 [希望する結果] CODE 日付 A 20080101 A 20080102 B 20080101 C 20080101 C 20080103 これはクエリで可能なのでしょうか。 ご教授よろしくお願いします。
- ベストアンサー
- その他(データベース)
お礼
回答ありがとうございます。 今回もお世話になります。 NULLの列を作り、UNIONでくっつける方法もあるのですね。 勉強になります。 ありがとうございました。