Zu Ihrer Information: In diesem Fall wurde als Ursache ein Spaltenname mit gemischter Groß-/Kleinschreibung in der DDL für die Tabellenerstellung festgestellt.
Wenn Sie jedoch "Old Style"- und ANSI-Joins mischen, können Sie dieselbe Fehlermeldung erhalten, selbst wenn die DDL ordnungsgemäß mit einem Tabellennamen in Großbuchstaben durchgeführt wurde. Dies geschah zu mir, und Google schickte mich zu dieser Stackoverflow-Seite, so dass ich dachte, ich würde teilen, da ich hier war.
--NO PROBLEM: ANSI syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
INNER JOIN PS_NAME_PWD_VW B ON B.EMPLID = A.EMPLID
INNER JOIN PS_HCR_PERSON_NM_I C ON C.EMPLID = A.EMPLID
WHERE
LENGTH(A.EMPLID) = 9
AND LENGTH(B.LAST_NAME) > 5
AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/
--NO PROBLEM: OLD STYLE/deprecated/traditional oracle proprietary join syntax
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM PS_PERSON A
, PS_NAME_PWD_VW B
, PS_HCR_PERSON_NM_I C
WHERE
B.EMPLID = A.EMPLID
and C.EMPLID = A.EMPLID
and LENGTH(A.EMPLID) = 9
AND LENGTH(B.LAST_NAME) > 5
AND LENGTH(C.LAST_NAME) > 5
ORDER BY 1, 2, 3
/
Die beiden obigen SQL-Anweisungen sind gleichwertig und führen zu keinem Fehler.
Wenn Sie versuchen, sie zu mischen, können Sie Glück haben, oder Sie können einen Oracle hat einen ORA-00904-Fehler erhalten.
--LUCKY: mixed syntax (ANSI joins appear before OLD STYLE)
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM
PS_PERSON A
inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
, PS_NAME_PWD_VW B
WHERE
B.EMPLID = A.EMPLID
and LENGTH(A.EMPLID) = 9
AND LENGTH(B.FIRST_NAME) > 5
AND LENGTH(C.LAST_NAME) > 5
/
--PROBLEM: mixed syntax (OLD STYLE joins appear before ANSI)
--http://sqlfascination.com/2013/08/17/oracle-ansi-vs-old-style-joins/
SELECT A.EMPLID, B.FIRST_NAME, C.LAST_NAME
FROM
PS_PERSON A
, PS_NAME_PWD_VW B
inner join PS_HCR_PERSON_NM_I C on C.EMPLID = A.EMPLID
WHERE
B.EMPLID = A.EMPLID
and LENGTH(A.EMPLID) = 9
AND LENGTH(B.FIRST_NAME) > 5
AND LENGTH(C.LAST_NAME) > 5
/
Und die wenig hilfreiche Fehlermeldung, die das Problem gar nicht wirklich beschreibt:
>[Error] Script lines: 1-12 -------------------------
ORA-00904: "A"."EMPLID": invalid identifier Script line 6, statement line 6,
column 51
In dem folgenden Blogbeitrag habe ich einige Untersuchungen dazu gefunden:
In meinem Fall habe ich versucht, manuell von Joins im alten Stil zu ANSI-Joins zu konvertieren, und zwar schrittweise, eine Tabelle nach der anderen. Das scheint eine schlechte Idee gewesen zu sein. Stattdessen ist es wahrscheinlich besser, alle Tabellen auf einmal zu konvertieren oder eine Tabelle und ihre Where-Bedingungen in der ursprünglichen Abfrage auszukommentieren, um sie mit der neuen ANSI-Abfrage zu vergleichen, die Sie schreiben.
0 Stimmen
Sind Sie sicher, dass der Spaltenname Department_Code richtig geschrieben ist?
0 Stimmen
Ja, es gibt eine Spalte Department_Code
16 Stimmen
TL;DR: einfache Anführungszeichen verwenden
''
.0 Stimmen
In meinem Fall handelte es sich um eine berechnete Spalte, die in der Datenbank nicht vorhanden war.
0 Stimmen
Ich musste Anführungszeichen für Schneeflocke verwenden.