PL-SQL как дважды выполнить внутреннее соединение в одной и той же таблице

#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. фейспалм… ты прав… столбец, который я пытался использовать, назван иначе, чем то, что я сделал…