#oracle #select #concatenation
Вопрос:
Я пытаюсь объединить два столбца и сравнить это значение с условием «не в» из другого выбора, но мне это не удается. Моя последняя попытка:
SELECT valorA || SubStr(valorB,3,2) AS al,hours FROM table_A
where valorA LIKE '%RR%'
AND hours > To_Date('24/09/2021 12:00','dd/mm/yyyy HH24:mi')
AND al NOT IN (
SELECT vr
FROM table_B )
Его ошибка возврата: ORA-00904: «AL»: неверный идентификатор
Комментарии:
1. Вам также нужно выполнить объединение в
WHERE
предложении. Вы не можете ссылаться на псевдонимы столбцов нигде, кромеORDER BY
предложения.
Ответ №1:
Как сказал Дел (например, это имя!), вы не можете ссылаться на псевдоним столбца в том же блоке запроса. Выбор состоит в том, чтобы перефразировать конкатенацию в предикате (как указала Дел).:
SQL> SELECT valorA || SubStr(valorB,3,2) AS al,hours FROM table_A
2 where valorA LIKE '%RR%'
3 AND hours > To_Date('24/09/2021 12:00','dd/mm/yyyy HH24:mi')
4 AND valorA || SubStr(valorB,3,2) NOT IN (
5 SELECT vr
6* FROM table_B );
no rows selected
Используйте подзапрос, либо факторинг подзапроса, либо встроенный подзапрос. Количество предикатов, которые вы нажимаете, должно зависеть от того, используете ли вы один и тот же блок запроса потенциально несколько раз в одном и том же stmt … . Не должно иметь значения для оптимизатора.
-- subquery factoring
SQL> with q as
2 (SELECT valorA || SubStr(valorB,3,2) AS al,hours FROM table_A
3 where valorA LIKE '%RR%'
4 AND hours > To_Date('24/09/2021 12:00','dd/mm/yyyy HH24:mi'))
5 select al, hours from q
6 where al NOT IN (
7 SELECT vr
8* FROM table_B );
no rows selected
-- subquery factoring, less predicates pushed down
SQL> with q as
2 (SELECT valorA || SubStr(valorB,3,2) AS al,hours FROM table_A
3 where valorA LIKE '%RR%')
4 select al, hours from q
5 where hours > To_Date('24/09/2021 12:00','dd/mm/yyyy HH24:mi')
6 and al NOT IN (
7 SELECT vr
8* FROM table_B );
no rows selected
-- normal, embedded subquery
SQL> select al, hours from
2 (SELECT valorA || SubStr(valorB,3,2) AS al,hours FROM table_A
3 where valorA LIKE '%RR%')
4 where hours > To_Date('24/09/2021 12:00','dd/mm/yyyy HH24:mi')
5 and al NOT IN (
6 SELECT vr
7* FROM table_B );
no rows selected
Комментарии:
1. Спасибо, ребята! Я сделал отдельный выбор и вставил » al «в предложение «где», как вы подслащивали.