ご存知の方がおられましたら、教えて下さい。
下記のように、親テーブルと親子を管理するための親子管理テーブルがあります。
条件として、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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
単一グループのグループ関数で...
-
トランザクションログを出力せ...
-
BLOB型項目をSQLの検索条件に指...
-
【PL/SQL】FROM区に変数を使う方法
-
VBAでDBから取得したデータを突...
-
group byの並び順を変えるだけ...
-
SQL初心者です。
-
ソート。内容の一部を置換して...
-
データコンボに2つのフィール...
-
並べ替えについて
-
Mysqlで変数を使ったSELECT文の...
-
レコードの登録順がおかしい
-
ある項目(数値)に加算したも...
-
項目1の日付順に並べ項目2の...
-
アウトルック2003 アドレス帳...
-
日付検索で0001-01-01 00:00:00...
-
ある文字列の一部がDBに有るか...
-
テーブルの最後(最新)のレコー...
-
Select文1 マイナス Select文2
-
日付のフォーマット
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【PL/SQL】FROM区に変数を使う方法
-
単一グループのグループ関数で...
-
where句中のtrim関数について
-
SQL*Loader Append
-
SELECT FOR UPDATE で該当レコ...
-
group byの並び順を変えるだけ...
-
AccessのSQL文で1件のみヒット...
-
アクセスのレポートでレコード...
-
トランザクションログを出力せ...
-
引数によってwhere句を切り替え...
-
データ
-
SQLで条件にヒットしたレコード...
-
1レコード全てを改行なしで表...
-
「数字で始まらない」ものを抽...
-
BLOB型項目をSQLの検索条件に指...
-
ACCESS レコードの並び順について
-
PL/SQL内の共通関数の引数にフ...
-
デフォルトでデータが表示され...
-
【SQL】違うフィールド同士の集...
-
osqleditについて
おすすめ情報