
基本的なことなのかもしれませんが・・・
AとBというテーブルがあり、あるタイミングでAを元にBを作成します。つまりBはデータがある場合とない場合があります。また、2つは関連番号で紐づいています。
Aテーブルを抽出したい時に、抽出条件は以下です。
・Bテーブルのステータスが1であれば抽出
・Bテーブルのステータスが0であれば非抽出
・Bテーブルにデータがなければ抽出
INNER JOINだとデータがない時に抽出できないし、
WHERE句にCASE句を入れればいいのかなと思いましたが、テーブルにデータがあればなんて条件書けないしで詰まりました。
SELECTした結果に対して条件つけて抽出する手も思いつきましたが
もっと美しいSQLがあれば教えてもらえないでしょうか。
環境はSQLServerです。よろしくお願いします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
一般的手法である外部結合(LEFT-JOIN)での場合
select A.*
from A left join B on (A.関連番号=B.関連番号)
where B.関連番号 is NULL or B.ステータス=1
オマケですが..
外部結合なんかなくたって..その1
select A.* from A,B where B.関連番号=A.関連番号 and B.ステータス=1
union all
select A.* from A where not exists(select 1 from B where B.関連番号=A.関連番号)
外部結合なんかなくたって..その2
select A.* from A
where not exists(select 1 from B where B.関連番号=A.関連番号 and B.ステータス=0)
ありがとうございます!
そうか、LEFT JOINしてそれに対してWHERE句で条件加えれば。
UNIONに関してはすっぽり抜け落ちてました。。。
NOT EXISTSなんてのがあるんですね。
勉強になりました。
No.3
- 回答日時:
Aが Bが
ID NAME ID STAT
1 ABC 1 0
2 DEF 3 1
3 XYZ
のときに
ID NAME STAT
2 NULL NULL
3 XYZ 1
とするのでしょうか?
そうするなら、INNER JOINでAとBを結合して、
それをLEFT JOINすればいけそうです。
SELECT A.ID, C.DATA, C.STAT FROM A
LEFT JOIN (
SELECT DATA, A.ID ID, STAT FROM A
INNER JOIN B ON A.ID=B.ID
) C
ON A.ID=C.ID
WHERE C.STAT=1 OR C.STAT IS NULL
ありがとうございます!
INNER JOINしたものをLEFT JOIN。。。
僕の概念には全くなかった方法です。勉強になります。
No.2
- 回答日時:
片方のテーブルにデータがなくても抽出したい場合は
LEFT JOINなどの外部結合を使います。
するとBテーブルにデータがないと、Bテーブルを参照する値がNULLで帰ってきます。
その上で、WHERE STAT=1 OR STAT=NULL
で抽出できます。
AにDATAとID、BにIDとSTATとして、Bでつながってると
以下で検索できます。
SELECT A.DATA, A.ID, B.STAT
FROM A LEFT JOIN B ON A.ID=B.ID
WHERE B.STAT=1 OR B.STAT IS NULL
ありがとうございます。
ただ、LEFT JOINすると、BのデータはNULLで返ってきますが、Aのデータは抽出できてしまいました。
Bのステータスを条件として、否であればAのデータもろとも抽出しないという風にしたいのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
単一グループのグループ関数ではありません。
Oracle
-
Access の SQL で、Aがなかったら、Bを抽出したい
Access(アクセス)
-
GROUP BYを行った後に結合したい。
Oracle
-
-
4
テーブルからのselectにおいてデータの有無により結果をわけたい
PostgreSQL
-
5
SQLで、Join句で結合したテーブルにデータが無い場合について
SQL Server
-
6
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
7
SQLのエラー(~付近に不適切な構文があります)
SQL Server
-
8
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
9
SELECTで1件のみ取得するには?
Oracle
-
10
データ無し時は空白行にしたい【SQLITE】
その他(データベース)
-
11
select句副問い合わせ 値の個数が多すぎます
Oracle
-
12
一部のカラムでdistinctし全てのカラムを取得
MySQL
-
13
特定条件でWHERE句の条件を変更したい
SQL Server
-
14
他のデータベースとのテーブル結合
SQL Server
-
15
テーブルに存在しない列をselect文で出力する事はできないでしょうか?
PostgreSQL
-
16
SELECT 文の NULL列は?
PostgreSQL
-
17
SELECT 文 GROUP での1件目を取得
SQL Server
-
18
FROM の中で CASE を使えるでしょうか
SQL Server
-
19
SELECTの結果で同一行を複数回出力する
Oracle
-
20
カラムの存在チェック
SQL Server
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
プログラミングを学べる!?進化している子どものおもちゃについて専門家に聞いた!
プログラミングを学べるレゴブロックがあることはご存知だろうか。レゴに限らず最近のおもちゃには、プログラミングの要素がどんどん取り入れられているようだ。「教えて!goo」にも、「プログラミングを学べる子供...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【access】複数のフィールドの...
-
ACCESSで実行時エラー3008
-
SQLServer→Access インポート
-
データがあれば○○なければのSQL
-
アクセスで定数を利用したい。
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
エクセルVBAで、MsgBox やInput...
-
【Excel VBA】マクロボタンを表...
-
VBAでCOPYを繰り返すと、処理が...
-
UMLでの例外処理
-
CloseとDisposeの違い
-
VBAでループ内で使う変数名を可...
-
VBA エンターキーでイベントに...
-
エクセル 桁分割
-
Excelシート上のマクロを登録し...
-
エクセルの画面にユーザーフォ...
-
月度は何て読みますか?
-
マクロで作ったボタンのサイズ...
-
マクロを登録しているボタンが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESS DCOUNTの抽出条件について
-
アクセスで定数を利用したい。
-
データがあれば○○なければのSQL
-
Access vbaで重複レコードの削...
-
【access】複数のフィールドの...
-
sql文で削除クエリを書く
-
VBAでテーブル名とカラム名を動...
-
【PHP/MySQL】コード上で生成...
-
DAOでSQLServerに接続し、LeftJ...
-
Accessリンクするテーブルが見...
-
ACCESSで購入回数を表示する方...
-
ACCESS VBAでテーブル内の特定...
-
CMD.Executeの結果をメッセージ...
-
アクセスのテーブルのフィール...
-
BBSのレスを表示させるためのSQ...
-
SQL EXCEL VBA 接続
-
重複した複数のレコードを1レ...
-
社員名簿から検索する関数
-
Access から Excelのシートをイ...
-
Accessについて
おすすめ情報