*Oracle ORA-00918: Mehrdeutige Spaltendefinition – Ein SELECT -Abfrageproblem**
Das Ausführen einer SELECT *
-Abfrage für mehrere verbundene Tabellen in Oracle kann zum gefürchteten ORA-00918-Fehler führen: „mehrdeutige Spaltendefinition“. Dies geschieht, wenn Ihre Abfrage Spalten mit identischen Namen aus verschiedenen Tabellen enthält. Oracle kann nicht ermitteln, welche Spalte Sie abrufen möchten.
Hier ist eine Beispielabfrage, die häufig diesen Fehler auslöst:
<code class="language-sql">SELECT * FROM (SELECT DISTINCT(coaches.id), people.*, users.*, coaches.* FROM "COACHES" INNER JOIN people ON people.id = coaches.person_id INNER JOIN users ON coaches.person_id = users.person_id LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id ) WHERE rownum <= 25</code>
Die Wurzel des Problems
Das SELECT *
versucht, alle Spalten abzurufen, aber da id
in mehreren Tabellen (coaches
, people
, users
) vorhanden ist, ist Oracle unsicher, welche id
-Spalte ausgewählt werden soll.
Die Lösung: Präzise Spaltenspezifikation
Um ORA-00918 zu beheben, vermeiden Sie SELECT *
. Listen Sie stattdessen explizit die benötigten Spalten auf. Es gibt zwei Hauptwege, dies zu erreichen:
1. Direkte Spaltenauswahl
Geben Sie jede Spalte mit ihrem vollständig qualifizierten Namen (table.column) an:
<code class="language-sql">SELECT coaches.id, people.name, users.username, coaches.team FROM (SELECT DISTINCT(coaches.id), people.*, users.*, coaches.* FROM "COACHES" INNER JOIN people ON people.id = coaches.person_id INNER JOIN users ON coaches.person_id = users.person_id LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id ) WHERE rownum <= 25</code>
2. Verwendung von Spaltenaliasen
Weisen Sie Spalten mit demselben Namen eindeutige Aliase zu, indem Sie das Schlüsselwort AS
verwenden:
<code class="language-sql">SELECT coaches.id AS coaches_id, people.name AS person_name, users.username AS user_username, coaches.team AS coaches_team FROM (SELECT DISTINCT(coaches.id), people.*, users.*, coaches.* FROM "COACHES" INNER JOIN people ON people.id = coaches.person_id INNER JOIN users ON coaches.person_id = users.person_id LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id ) WHERE rownum <= 25</code>
Durch die Verwendung einer der beiden Methoden stellen Sie Oracle eindeutige Anweisungen zur Verfügung, beheben den ORA-00918-Fehler und stellen sicher, dass Ihre Abfrage erfolgreich ausgeführt wird. Denken Sie daran, die Beispielspaltennamen durch Ihre tatsächlichen Spaltennamen zu ersetzen.
Das obige ist der detaillierte Inhalt vonWie behebt man Oracles ORA-00918: Mehrdeutiger Spaltendefinitionsfehler in SELECT *-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!