![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
次の2つのテーブルがあります。
テーブル master
形式kata
客先kyaku
コードcode
テーブル data
形式kata
客先kyaku
発行年月hakko
数量suryo
発行年月が201303と201305の両方があるマスタを抜き出したいため、次のSQLを考えました。
select m.kata,m.kyaku,m.code from master m join data d on m.kata=d.kata and m.kyaku=d.kyaku where 201303 in (select d.hakko from data d where m.kata=d.kata and m.kyaku=d.kyaku)
and 201305 in (select d.hakko from data d where m.kata=d.kata and m.kyaku=d.kyaku)
無駄があるようで、また速度向上したいのですが、どう記述していいか分かりません。
教えてください。
No.3ベストアンサー
- 回答日時:
パッと思いつくのは下記の2つほどですね。
a. 相関サブクエリを使う方法
SELECT * FROM master m
WHERE (
SELECT COUNT(DISTINCT hakko) FROM data d
WHERE m.kata = d.kata AND m.kyaku = d.kyaku AND hakko IN (201303, 201305)
) >= 2
WHERE句では、一つ一つの master レコードについて、 kata と kyaku が同じで hakko が 201303 か 201305 の data レコードを取り出し、その hakko の値が2種類以上有るかどうか調べています。DISTINCT が付いているのは hakko に同じ値が複数有っても1つと数えるためです。
b. 結合してHAVING句で判定する方法
SELECT m.kata, m.kyaku, m.code
FROM
master m join data d on m.kata = d.kata and m.kyaku = d.kyaku
GROUP BY m.kata, m.kyaku, m.code
HAVING
SUM(CASE hakko WHEN 201303 THEN 1 ELSE 0 END) >= 1 AND
SUM(CASE hakko WHEN 201305 THEN 1 ELSE 0 END) >= 1
master と data を結合したものを master の項目でグループ化し、HAVING句で hakko が 201303 のものと 201305 のものが存在するか判定しています。
性能的には、どちらも今一つかも知れません・・・。
MySQL version 5.5.8 で確認しました。
http://codezine.jp/article/detail/907
http://codezine.jp/article/detail/405?p=2
No.2
- 回答日時:
こんな感じかな
select * from master where (kata,kyaku)
in(
select kata,kyaku from data where hakko in('201303','201305')
having count(distinct hakko) =2
)
No.1
- 回答日時:
MySQLは最新版でもまだintersectはできないのでしたっけ?
MySQLで積集合演算(intersect)を模倣する
http://codezine.jp/article/detail/3906?p=2
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Oracle SQL update方法 2 2022/06/22 14:07
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
limit offset はupdate文には使...
-
AccessVBAについて テーブルの...
-
フラグをたてるってどういうこ...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
あってますか?SQL
-
truncate tableを使って複数の...
-
既存データをINSERT文にして出...
-
ADO+ODBCでテーブルに接続する...
-
CSVファイルを読み込んでテーブ...
-
エラーを起こす方法
-
UPDATEで既存のレコードに文字...
-
ACCESS クエリーでソートの不具合
-
テーブル名が可変の場合のクエ...
-
PostgreSQLのtimestamp型で時間...
-
SELECTした結果に行番号を求めたい
-
accessのデータをoracleへinser...
-
ExcelのVLOOKUP関数の動作をMyS...
-
追加クエリで重複データなしで...
-
集計でテストの各教科の最高得...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
1つのSQLで2段階の抽出を行い...
-
【SQL】項目に紐づいている情報...
-
複数の値を1レコードに表示した...
-
limit offset はupdate文には使...
-
SQLでレコード間の値の交換
-
SQLで、過去で一番大きい日付の...
-
SQLのinの使い方
-
SQL文の書き方
-
AccessVBAについて テーブルの...
-
2つフィールドを連結して検索す...
-
MySQL(4.1)でのサブクエリ...
-
抽出結果にレコードNoを付与す...
-
mysqlのindexとprimary keyにつ...
-
ACCESS サブフォームについて
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
Accessで今日から5日後
-
UPDATEで既存のレコードに文字...
おすすめ情報