複数の表を主キーで結合する際、そのまま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
No.2
- 回答日時:
※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つの問合せに多数のデータテーブルおよびマスタを結合する必要があり、
どうしてもこのようなことが発生してしまうのです。
解決方法をご存知であれば教えて下さい。
No.1ベストアンサー
- 回答日時:
結合する表に対しビューを作成してはいかがでしょうか?
=========================
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→"登録日"」と言うようにする事も
出来ますよね。
「登録日の列名は変更できません。」という制限が
あるので、ここで記述した方法はそもそも使えない
可能性も有りますが...。
回答ありがとうございます。
確かに専用のビューを作成し、Natural Joinによって表と結合すれば
正しい結果を得ることができました。
「登録日の列名は変更できません」というのは列名自体を
変更できないという意味です。
この方法ですとどの表の登録日でも取得することができていいですね。
しかしこれだと、登録日を持つ全ての表に対しビューを
作成する必要があります。また表に列を追加するときは
ビューにも追加しないといけないみたいですね。
Oracleであれば独自のSQL構文でできるかと思ったのですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- PostgreSQL SQLで検索結果の記事を表示したい 1 2022/04/28 21:03
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Excel(エクセル) Excel同士のデータの突合 3 2023/08/07 16:34
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
うまくいきません教えてくださ...
-
SQLです。こんな感じですか?あ...
-
accessで在庫管理
-
update文で改行を入れる
-
SELECT 文の NULL列は?
-
テーブルリンク リンク元を知...
-
テーブル名をカラムとして取得...
-
一つ前に戻るには…
-
Accessのテーブルデータを一気...
-
Accessでデータシートに同じデ...
-
会社の飲み会の幹事になり、座...
-
Notion@リレーション値の取得...
-
件数の多い順にselect
-
外部キーだけのテーブル(主キ...
-
SQL、2つのテーブルで条件一致...
-
男性と2人で飲食店に行きテーブ...
-
JavaScriptでAccessのテーブル...
-
「テーブルに座って……」という...
-
論理名とコメント構文(?)について
-
SQL update方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQLです。こんな感じですか?あ...
-
うまくいきません教えてくださ...
-
下記の問合せを行うクエリを、P...
-
下記の問合せを行うクエリを、P...
-
accessで在庫管理
-
サブクエリを使用せずにLEFT JO...
-
現在庫算出方法についてお教え...
-
SQL CASE文に制御について
-
access結合クエリを編集可能に
-
相関サブクエリの中で、グルー...
-
Access 出荷管理簿を作りたい...
-
SQLの作成方法
-
グループごとの最高得点者一覧...
-
update文におけるwhereとjoinの...
-
Accessでデータシートに同じデ...
-
SELECT 文の NULL列は?
-
テーブル名をカラムとして取得...
-
SQL、2つのテーブルで条件一致...
-
一つ前に戻るには…
-
update文で改行を入れる
おすすめ情報