![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
ご存知の方がおられましたら、教えて下さい。
下記のように、親テーブルと親子を管理するための親子管理テーブルがあります。
条件として、CD1の1が指定された時、親テーブルよりNOが2のレコードと(これは親子関係がないレコード)
親子関係のレコードの親レコードであるNOが1のレコードと子レコードであるNOが11の3レコード
を1つのSQL文で取得したいのですが、可能でしょうか?
ご存知の方がおられましたら、ご教授のほどよろしくお願い致します。
親テーブル(OYA_TBL)
NO,BN1,CD1
-------------
1,4,NULL
2,NULL,1
3,NULL,NULL
11,4,1
12,4,2
13,4,NULL
親子管理テーブル(OYA_KO_TBL)
GOODS_NO,PACK_GOODS_NO
-------------
1,11
1,12
1,13
↓
[取得結果]
NO,BN1,CD1
-------------
1,4,NULL
2,NULL,1
11,4,1
No.3ベストアンサー
- 回答日時:
>親テーブルよりNOが2のレコードと(これは親子関係がないレコード)
>親子関係のレコードの親レコードであるNOが1のレコードのみを取得したい場合(子レコードは不要)、どうすればよいでしょうか?
先ほどのSQLに、条件を追加すると下記。
少し、無駄がありそうですね。
SELECT OYA_TBL.*
FROM OYA_TBL
WHERE
(
OYA_TBL.CD1 = 1
OR
EXISTS (
SELECT Y.GOODS_NO
FROM OYA_TBL X INNER JOIN OYA_KO_TBL Y
ON (X.NO = Y.PACK_GOODS_NO)
WHERE (X.CD1 = 1) AND (Y.GOODS_NO = OYA_TBL.NO)
)
)
AND
NOT EXISTS (
SELECT Z.PACK_GOODS_NO
FROM OYA_KO_TBL Z
WHERE (Z.PACK_GOODS_NO = OYA_TBL.NO)
);
------------------------------------------------------------
下記の方が良いかな?
条件を分けて、UNIONで結合。
SELECT OYA_TBL.*
FROM OYA_TBL, OYA_KO_TBL X, OYA_TBL Y
WHERE (OYA_TBL.NO = X.GOODS_NO)
AND (X.PACK_GOODS_NO = Y.NO)
AND (Y.CD1 = 1)
UNION
SELECT OYA_TBL.*
FROM OYA_TBL LEFT JOIN OYA_KO_TBL B
ON OYA_TBL.NO = B.PACK_GOODS_NO
WHERE (OYA_TBL.CD1 =1)
AND (B.PACK_GOODS_NO Is Null);
------------------------------------------------------------
更に別回答。
LEFT JOIN の結合をメインに。
SELECT OYA_TBL.*
FROM
(
(
OYA_TBL LEFT JOIN OYA_KO_TBL X
ON OYA_TBL.NO = X.GOODS_NO
) LEFT JOIN OYA_TBL Y
ON X.PACK_GOODS_NO = Y.NO
) LEFT JOIN OYA_KO_TBL Z
ON OYA_TBL.NO = Z.PACK_GOODS_NO
WHERE ( (OYA_TBL.CD1 = 1) AND (Z.GOODS_NO Is Null) ) OR (Y.CD1 = 1);
------------------------------------------------------------
ついでに、最初の質問の別解。
サブクエリをなくして、テーブル結合で。
SELECT X.*
FROM
(
OYA_TBL X LEFT JOIN OYA_KO_TBL Y
ON X.NO = Y.GOODS_NO
) LEFT JOIN OYA_TBL Z
ON Y.PACK_GOODS_NO = Z.NO
WHERE (X.CD1 = 1) OR (Z.CD1 = 1);
------------------------------------------------------------
全てAccess2000で動作確認。
文法の違いが分からないので、
Oracleでも動きそうなものを選んで下さい。
色々とご教授下さり、ありがとうございました。
CD1の条件が必要ない場合もあるようで、その場合は親子関係のレコードを全て抽出する必要があり、そうすると最初に教えていただいたexistを使ったSQLだと、親レコードしか取得できなかったので、
LEFT JOIN の結合をメインにしたSQL文を採用させていただきました。
僕自身、あまりexist条件って使った事がなかったので、勉強になりました。本当に、助かりました。ありがとうございました。
No.2
- 回答日時:
SELECT OYA_TBL.*
FROM OYA_TBL
WHERE OYA_TBL.CD1 = 1
OR
EXISTS (
SELECT Y.GOODS_NO
FROM OYA_TBL X INNER JOIN OYA_KO_TBL Y
ON (X.NO = Y.PACK_GOODS_NO)
WHERE (X.CD1 = 1) AND (Y.GOODS_NO = OYA_TBL.NO)
);
Oracleは使ってないので、Access2000で検証しました。
文法の違いなどがあれば読み替えて下さい。
ご回答ありがとうございます。ちなみに、
親テーブルよりNOが2のレコードと(これは親子関係がないレコード)
親子関係のレコードの親レコードであるNOが1のレコードのみを取得したい場合(子レコードは不要)、どうすればよいでしょうか?
何度もすいませが、ご教授のほどよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Oracle SQL update方法 2 2022/06/22 14:07
- Access(アクセス) アクセスの更新クエリでカレントレコードのみ更新したい 1 2022/06/02 23:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【PL/SQL】FROM区に変数を使う方法
-
SELECT FOR UPDATE で該当レコ...
-
単一グループのグループ関数で...
-
group byの並び順を変えるだけ...
-
SQL*Loader Append
-
AccessのSQL文で1件のみヒット...
-
データ
-
BLOB型項目をSQLの検索条件に指...
-
トランザクションログを出力せ...
-
「数字で始まらない」ものを抽...
-
1レコード全てを改行なしで表...
-
【SQL】違うフィールド同士の集...
-
トリガからプロシージャのコー...
-
osqleditについて
-
大量レコードをTRUNCATEせずに...
-
440 OIP エラーについて(ORADC)
-
SQLで条件にヒットしたレコード...
-
where句中のtrim関数について
-
アクセスのレポートでレコード...
-
一気に複数のレコードをinsert...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【PL/SQL】FROM区に変数を使う方法
-
group byの並び順を変えるだけ...
-
単一グループのグループ関数で...
-
where句中のtrim関数について
-
AccessのSQL文で1件のみヒット...
-
SQL*Loader Append
-
アクセスのレポートでレコード...
-
引数によってwhere句を切り替え...
-
「数字で始まらない」ものを抽...
-
SELECT FOR UPDATE で該当レコ...
-
SQLで条件にヒットしたレコード...
-
データ
-
トランザクションログを出力せ...
-
【SQL】違うフィールド同士の集...
-
大量レコードをTRUNCATEせずに...
-
ACCESS レコードの並び順について
-
BLOB型項目をSQLの検索条件に指...
-
1レコード全てを改行なしで表...
-
oracle DB内のデータを増幅す...
-
あるカラムに同じ値を持つレコ...
おすすめ情報