![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
外部結合に関する質問です。
表A | 表B
ID 名前 | ID 所持品
1 田中 | 1 りんご
2 佐藤 | 1 バナナ
3 鈴木 | 3 バナナ
このように「誰が、何を持っているか」を表した表AとBがあるとき、
以下の条件でデータを取得したいと考えております。
・ 所持品がある人は、名前と所持品の組み合わせを表示
・ 所持品がない人は、名前だけを表示
・ りんごをもっていない人は、名前と所持品の組み合わせに
加え名前だけの結果も表示
・ UNIONは使いたくない
( 欲しい結果 )
名前 所持品
田中 りんご
田中 バナナ
佐藤 (空) ← 所持品なし
鈴木 バナナ
鈴木 (空) ← りんごなし
SELECT A.名前, B.所持品 FROM A, B WHERE A.ID = B.ID(+)
では『鈴木 ( 空 )』 が取得できません。。。
UNIONを使えばできたのですが、都合上UNIONを使わず
上記のような結果を取得したいと考えています。
どなたかお知恵をお貸しいただけませんでしょうか。
よろしくお願いします。
No.5ベストアンサー
- 回答日時:
>件数が多いとちょっと重くなりそうな気がするのですが
『鈴木(空)』を取得するのが表示上の問題だとすると、
SQLとして本質的なことではないでしょう。
(人間様には必要でも、DBではあずかり知らぬこと)
そんな場合、DBには
SELECT A.名前, B.所持品 FROM A, B WHERE A.ID = B.ID(+)
だけ投げておいて、『鈴木(空)』はフロントエンド側で
何とかする……というのも一つの方法だと思います。
今回は、面白そうなSQLだったので参加しました(笑)。
お礼が遅くなって申し訳ありませんでした。
dda167さんの
>SQLとして本質的なことではないでしょう
という尤もなご指摘を受けて考え直しました。
色々と検討したのですが、今回はUNIONを使用した上で
プログラムの方をどうにかすることで解決いたしました。
的確なご指摘をいただいた点でベストアンサーに
選ばせていただきました。ありがとうございました!
ShimoHayhaさんの回答もSQLの知識の上で大変参考になりました。
結果的にベストアンサーにお選びできませんでしたが、
とても勉強になりました。ありがとうございました!
No.4
- 回答日時:
>コストを気にするとやはりUNIONを使う方がいいのでしょうか。
。。コストを気にするなら、UNION ALLを使ったほうが……
(重複問題がなければの話ですけど)
SQLは、同じ結果を得るのに、いろいろな書き方があるじゃないですか。
パフォーマンスやメンテナンスなどを考慮して最終的に決定するでしょうが、
その選択肢を自ら削る必要もないのでは……と思っただけです。
10gだとこんな書き方もありますね。
SELECT DISTINCT T.名前, T.所持品 FROM
(SELECT A.名前, B.所持品 FROM A LEFT OUTER JOIN B ON A.ID = B.ID) T
PARTITION BY (名前) RIGHT OUTER JOIN
(SELECT DISTINCT 所持品 FROM B) M
ON T.所持品 = M.所持品
No.3
- 回答日時:
No.2 です。
No.2 は明らかに間違ってました。
こんな感じですかね・・・(またまた未検証ですが)
SELECT COALESCE(S.名前, R.名前), S.所持品
FROM
(
SELECT A.ID ID, A.名前 名前, B.所持品 所持品
FROM A
LEFT OUTER JOIN B ON A.ID = B.ID
)
S
FULL OUTER JOIN
(
SELECT A.ID ID, A.名前 名前
FROM A
LEFT INNER JOIN B ON A.ID = B.ID AND B.所持品 != 'りんご'
)
R
ON S.ID = R.ID
ご回答ありがとうございます!
今検証できる環境ではないので確認はまだなのですが、
COALESCという関数は知らなかったです。
検証してみて、またご報告させていただきます。
取り急ぎ御礼まで。ありがとうございます。
No.2
- 回答日時:
え~っと、未検証ですが、こういうことでしょうかね?
SELECT
A.名前, B.所持品
FROM
A
LEFT OUTER JOIN B ON A.ID = B.ID
LEFT OUTER JOIN
(
SELECT A.ID, B.所持品
FROM A
LEFT OUTER JOIN B
ON A.ID = B.ID AND B.所持品 = 'りんご'
WHERE B.所持品 IS NULL
) R
ON
A.ID = R.ID
No.1
- 回答日時:
「UNIONは使いたくない」理由は何ですか?
SELECT DISTINCT AX.名前, B.所持品 FROM (
SELECT DISTINCT A.ID, A.名前, B.所持品 FROM A, B
) AX, B
WHERE AX.ID = B.ID(+) AND AX.所持品 = B.所持品(+);
回答ありがとうございます!
SQLを動的に作成する箇所を含むプログラムを書いているのですが、
UNIONを使わないで済めば実装が簡単になりそうなので
そうした方法があれば、と思いまして。。。
今は検証ができないのですが、このSQLなら確かに取れそうですね。
件数が多いとちょっと重くなりそうな気がするのですが、
コストを気にするとやはりUNIONを使う方がいいのでしょうか。。。
その辺り確認してみたいと思います。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP MySql PHP 2つのテーブルをJOINで結合 user_idで抽出 1 2023/01/03 14:04
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- Visual Basic(VBA) 先ほど、回答者様によって教えていただいたのですがどうしたらいいか分かりません。 ユーザーフォーム上に 2 2023/02/21 22:25
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- 葬儀・葬式 お香典を代理でお願いする際の注意事項を教えてください。 2 2023/02/21 20:44
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
先ほど、斎藤さんというアプリ...
-
ラブホに盗撮カメラが設置され...
-
児童ポルノの検挙について。 5...
-
児童ポルノ単純所持で捕まるこ...
-
児童ポルノ
-
動画シェアでの児童ポルノ提供...
-
Tバック姿のJCJSと写真が撮れる...
-
以前、とある地方に行った時、...
-
銃刀法に関わるフェンシングの剣
-
計量法の「使用制限」について
-
【槍】銃刀法について
-
未成年の水着はすべて児童ポル...
-
ノコギリやナタは銃刀法違反に...
-
閲覧するだけで逮捕されること...
-
民間人は絶対に「短銃」を所持...
-
アダルトサイトと児童ポルノに...
-
生保ギリギリの生活です。生保...
-
中学受験です。
-
ライフルによるクマ駆除は不十...
-
1年以上前に、グループLINEにて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
先ほど、斎藤さんというアプリ...
-
ラブホに盗撮カメラが設置され...
-
児童ポルノ単純所持で捕まるこ...
-
児童ポルノの検挙について。 5...
-
裏DVD購入は違法なのか?
-
以前、とある地方に行った時、...
-
大麻を郵便で送って来た場合
-
いただき女子はアウトで、アイ...
-
閲覧するだけで逮捕されること...
-
Tバック姿のJCJSと写真が撮れる...
-
児童ポルノになりませんか?
-
児童ポルノ
-
熊対策にバールを持っていたら...
-
児童ポルノを自ら検索して閲覧...
-
ノコギリやナタは銃刀法違反に...
-
ツイッターに 卑猥な画像や動画...
-
アダルト無修正DVDの所持は違法?
-
未成年の水着はすべて児童ポル...
-
児童ポルノは家宅捜査された時...
-
動画シェアでの児童ポルノ提供...
おすすめ情報