- ベストアンサー
SQL 主キーによる自動的な表の結合
複数の表を主キーで結合する際、そのままWHERE句に条件を列挙するのが普通ですが、 主キーの数が多いので、これを簡単に記述方法はないでしょうか? できれば Natural Join のようにテーブル名のみを記述し、 DBMS(Oracle)が主キーのみを自動的に結合してくれればベストです。 Natural Join を使用できない理由の1つは、複数の表に登録日という列があり、 Natural Joinすると主キーでない登録日まで結合してしまうからです。 SQLは次のようになっています SELECT * FROM TBL_A NATURAL JOIN TBL_B NATURAL JOIN TBL_C ... ※join using, join on 句は使用できないようです。 ※登録日の列名は変更できません。 Oracle Database 9.2.0.4
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
結合する表に対しビューを作成してはいかがでしょうか? ========================= CREATE OR REPLACE VIEW TBL_A_V AS SELECT PK_1 , PK_2 , 登録日 AS TOUROKU_BI_A ←ここで明示的に別名にする。 FROM TBL_A; ========================= このようにする事で、NATURAL JOINを使用した時に、TOUROKU_BIという列を結合の対象にしなくなります。 また、"登録日"という列を使用する必要が無ければ、 ビューにおいて列指定から外してしまえば良いでしょう。 そして"登録日"という列を全て使用する必要がある場合で "登録日"列のデータ内容が異なる場合であれば、 (NATURAL JOINであろうがWHERE句を使用するもので あろうが)SELECT...FROMの列指定でどの表の"登録日" であるか識別する必要があるのではないでしょうか? 特に、NATURAL JOINを使用した場合には、列修飾子を 使用することが出来ないので。 結果セット内の列位置で決めている場合には、面倒でも SELECT...FROM内に列を列記して列別名を使用すれば、 「TOUROKU_BI_A→"登録日"」と言うようにする事も 出来ますよね。 「登録日の列名は変更できません。」という制限が あるので、ここで記述した方法はそもそも使えない 可能性も有りますが...。
その他の回答 (1)
- GoF
- ベストアンサー率37% (34/91)
※join using, join on 句は使用できないようです。 の文言がちょっと気になっての確認なのですが (9iR2だと、下記は実行できなかったかな?と思ったもので) SELECT * FROM TBL_A [INNER] JOIN TBL_B USING( COL~ ・・・) [INNER] JOIN TBL_C USING( COL~ ・・・) では、役不足? or 実行できない? なのでしょうか?
補足
回答が遅くなりすみません。 JOIN USING はもちろん構文上では使用できます。 問題は私が作成したSQLでは使用できないということです。 JOIN USING句は、結合する列がその記述より前に宣言されている必要があるようです。 例えば以下のテーブルがあるとします。 TABLE1(COL1, COL2) TABLE2(COL2, COL3) TABLE3(COL1, COL3) SELECT * FROM TABLE1 JOIN TABLE2 USING ... と書くと、TABLE2のCOL3で"無効な識別子"となります。 1つの問合せに多数のデータテーブルおよびマスタを結合する必要があり、 どうしてもこのようなことが発生してしまうのです。 解決方法をご存知であれば教えて下さい。
お礼
回答ありがとうございます。 確かに専用のビューを作成し、Natural Joinによって表と結合すれば 正しい結果を得ることができました。 「登録日の列名は変更できません」というのは列名自体を 変更できないという意味です。 この方法ですとどの表の登録日でも取得することができていいですね。 しかしこれだと、登録日を持つ全ての表に対しビューを 作成する必要があります。また表に列を追加するときは ビューにも追加しないといけないみたいですね。 Oracleであれば独自のSQL構文でできるかと思ったのですが。