ORA-01722: недопустимый номер, но только если запрос используется как подзапрос

Запрос, например:

SELECT SUM(col1 * col3) AS total, col2
FROM table1
GROUP BY col2

работает должным образом при индивидуальном запуске.

Для справки:

table1.col1 -- float
table1.col2 -- varchar2
table1.col3 -- float

Когда этот запрос перемещается в подзапрос, я получаю сообщение об ошибке ORA-01722 со ссылкой на позицию «col2» в предложении select. Более крупный запрос выглядит так:

SELECT col3, subquery1.total
FROM table3
LEFT JOIN (
    SELECT SUM(table1.col1 * table1.col3) AS total, table.1col2
    FROM table1
    GROUP BY table1.col2
) subquery1 ON table3.col3 = subquery1.col2

Для справки:

table3.col3 -- varchar2

Также стоит отметить, что у меня есть другой запрос от Таблица 2, который имеет ту же структуру, что и Таблица 1. Если я использую подзапрос из таблицы 2, он работает. Это никогда не работает при использовании table1.

Конкатенации нет, типы данных совпадают, запрос работает сам по себе ... Я тут в недоумении. Что еще мне следует искать? Какая до боли очевидная проблема смотрит мне в глаза?

(Я не выбирал и не создавал структуры таблиц и не могу их изменить, поэтому ответы на этот вопрос, к сожалению, не помогут.)

Я думаю, что проблема связана с ON table3.col3 = subquery1.col2, где col3 -> float и col2 -> varchar2.

Barbaros Özhan 06.09.2018 20:29

Просто для удовольствия назначьте псевдонимы table1 и table3 и используйте их во всех ссылках на столбцы в вашем запросе. Например, SUM(t1.col1 * t1.col3) вместо SUM(col1*col3). Это не имеет значения в опубликованном вами примере, но может пролить свет на ваш реальный (и, предположительно, более сложный) запрос.

Matthew McPeak 06.09.2018 20:33

@ BarbarosÖzhan table3.col3 - это varchar2, как и table1.col2, к которому я присоединяюсь.

Davis 06.09.2018 20:35

@MatthewMcPeak Они фактически имеют псевдонимы в моем фактическом запросе, в основном потому, что фактические имена таблиц очень длинные. Сам запрос действительно настолько прост, что довольно досадно.

Davis 06.09.2018 20:36

@ Дэвис, извини, хорошо table1.col3! = Table3.col3

Barbaros Özhan 06.09.2018 20:37

@ BarbarosÖzhan Да, извините, двойное использование col3 было неудачным выбором с моей стороны.

Davis 06.09.2018 20:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

попробуйте использовать правильное преобразование float в char ..

  SELECT col3, subquery1.total
  FROM table3
  LEFT JOIN (
      SELECT SUM(table1.col1 * table1.col3) AS total, table.1col2
      FROM table1
      GROUP BY table1.col2
  ) subquery1 ON to_char(table3.col3)  = subquery1.col2

Одно из немногих приведений, которые я, конечно, не пробовал ... поэтому table3.col3 и subquery.col2 были varchar2. Какой здесь секретный соус? : D Я так запуталась. Спасибо!

Davis 06.09.2018 20:44

@davis ... секрет ... посмотрите на определение схемы ... спокойно посмотрите на определение ... не смотрите слишком внимательно и не всегда смотрите на одни и те же вещи ... потому что, если они ошибаются, они останутся неправильными ... в любом случае лучше приведение числа к строке с учетом приведения от строки к числу

scaisEdge 06.09.2018 20:48

Другие вопросы по теме