Как объединить два столбца и сравнить значение с другой таблицей

#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 «в предложение «где», как вы подслащивали.