#oracle #plsql
Вопрос:
Я пытаюсь сделать запрос, который дважды присоединяется к таблице для языковых целей.
Но разработчик SQL всегда выдает ошибку
Недопустимый идентификатор в ВЫБОРЕ
когда я пытаюсь использовать ПСЕВДОНИМ своей таблицы (таблица 2 недопустима)
SELECT
table1.code Code,
table2.descr DescrFr,
table3.descr_en DescrEn
FROM
main_table table1
INNER JOIN
descr_table table2 ON table1.code = table2.code
AND table2.lang = 'fr'
INNER JOIN
descr_table table3 ON table1.code = table3.code
AND table3.lang = 'en'
Я не нашел ничего полезного для своего дела, что могло бы научить меня, что не так с моим запросом.
Редактировать
Протестировано по запросу пользователя, но привело к этой ошибке
Erreur SQL : ORA-00904: «TABLE3″.»code» : identificateur non valide
SELECT
table1.code AS Code,
table2.descr AS DescrFr,
table3.descr AS DescrEn
FROM main_table table1
INNER JOIN descr_table table2 ON (table1.code = table2.code)
INNER JOIN descr_table table3 ON (table1.code = table3.code)
WHERE (table2.lang = 'fr' AND table3.lang = 'en');
Ответ
В результате получается facepalm… первоначальный запрос работает.. я просто использовал неправильное имя столбца в таблице описания…
Комментарии:
1. Мне кажется странным, что вы присоединились бы дважды, когда у вас есть две колонки в
descr_table
одномdescr
и одномdescr_en
. ИЛИ… у вас на самом деле нет столбца сdescr_table
именемdescr_en
, и это вызывает ошибку?2. у меня есть 2 строки для FR и для языка EN, поэтому мне нужно ввести код в 1 строку, FR DESC и EN DESC, потому что в БД он находится в 2 строках.
3. У вас есть 2 столбца: descr и descr_en?
4. Однако я хочу сказать, что вы ссылаетесь на определенный столбец
descr_table
в своемSELECT
предложении. Вы говоритеtable3.descr_en
, у вас есть колонка в вашемdescr_table
descr_en
блоге ? Возможно, было бы разумно поделиться некоторыми образцами данных и желаемыми результатами. Это немного похоже на взрыв бомбы с завязанными глазами.5. В БД есть 2 строки (1 для языка FR и 1 для языка EN), но мне нужно получить запрос, который сделает их в одной строке кода, FR_DESC, EN_DESC
Ответ №1:
Я не знаю версию, которую вы используете, но я думаю, вы могли бы попробовать SELECT table1.code AS Code,...
. И я бы предпочел не использовать так много INNER JOIN
в вашем sql-запросе, а использовать хотя бы один RIGHT JOIN or LEFT JOIN
, потому что вам нужна «основная таблица», у которой самый высокий приоритет.
И, конечно, я думаю, что-то не так. так что ваш код будет в порядке таким образом:
SELECT
table1.code AS Code,
table2.descr AS DescrFr,
table3.descr_en AS DescrEn
FROM
main_table AS table1
INNER JOIN
descr_table AS table2 ON (table1.code = table2.code)
INNER JOIN
descr_table table3 ON (table1.code = table3.code)
WHERE
(table2.lang = 'fr' AND table3.lang = 'en')
Комментарии:
1. Ваш запрос не работает, потому что ключевое слово AS не работает в псевдониме для таблицы в TSQL, но даже если я удалю их, запрос все равно не сработает.
2. Не могли бы вы поделиться со мной сообщением об ошибке, пожалуйста?
3. Это в основном тот же запрос, что и уже опубликованная операция — я не вижу причин, по которым это сработало бы (если запрос операции не работает)
4. отредактировал свой оригинальный пост, я не знаю, может ли это помочь, потому что мы пишем один и тот же запрос, но по-разному
Ответ №2:
Я бы вообще избегал двойного соединения.
- и никогда не используйте псевдонимы, такие как
table1
Это может быть…
SELECT
main.Code,
descr.DescrFr,
descr.DescrEn
FROM
main_table main
INNER JOIN
(
SELECT
code,
MAX(CASE WHEN lang = 'fr' THEN descr END) AS DescrFr,
MAX(CASE WHEN lang = 'en' THEN descr END) AS DescrEn
FROM
descr_table
WHERE
lang IN ('fr', 'en')
GROUP BY
code
)
descr
ON descr.code = main.code
(И даже тогда, судя по вашему описанию, вам даже не нужно внешнее соединение, поскольку code
оно существует в descr_table
.)
Комментарии:
1. Вы должны знать, что большинство пользователей не могут поделиться описанием базы данных, поэтому я изменил запрос по мере необходимости, чтобы сохранить идею, лежащую в его основе (измененное имя таблицы, псевдоним и имя столбца).
2. запрос также не работает, он говорит мне, что descr является недопустимым идентификатором в предложении ON
3. @vince, И вы все еще не предоставили определение таблицы для
descr_table
. Согласно моему комментарию к вашему вопросу…(2) The error message implies that the [code] column doesn't exist, so please show the full table definition for [descr_table] (using describe or something similar, not by copying it by hand - so avoiding assumptions, typos, etc).
Мне совершенно ясно, что столбцаcode
просто не существует в таблицеdescr_table
.4. фейспалм… ты прав… столбец, который я пытался использовать, назван иначе, чем то, что я сделал…