Недопустимый идентификатор в запросе sql

У меня есть этот запрос sql:

select T1.ID, T2.ID 
from task t1, task t2
join workcase w on W.ID = T1.WORKCASE_ID
where W.ID = 1683964476
and T1.STATE < 501
and T2.STATE = 501

но когда я запускаю его, у меня есть эта ошибка:

ORA-00904: "T1"."WORKCASE_ID": invalid identifier

Что здесь не так?

2
nl ja de
существует столбец workcase_id в задаче
добавлено автор asifsid88, источник
Я снимаю свое предложение о дублировании. У Bluefeet есть правильный ответ, и это не связано с двойными кавычками.
добавлено автор APC, источник
Что означает из задачи t1, задача t2 ? Между таблицами нет условия соединения. Представляете ли вы крест? Как рассказать нам о структурах таблиц и о намерении запроса?
добавлено автор Martin Smith, источник
Какие СУБД вы используете? В таблице Task есть поле WORKCASE_ID ?
добавлено автор Andrey Gordeev, источник

3 ответы

Проблема в том, что вы смешиваете синтаксис JOIN . Вы используете неявное соединение (запятая) между T1 и T2 , а затем вы используете явный синтаксис JOIN для присоединения к рабочий стол .

Синтаксис JOIN имеет преимущество перед запятой, поэтому псевдоним недоступен, когда вы пытаетесь использовать его в условии соединения.

Если вам нужно использовать оба варианта, то вы должны использовать:

select T1.ID, T2.ID 
from
(
  select T1.ID, T2.ID, T1.WORKCASE_ID
  from task T1, task T2
  where T1.STATE < 501
    and T2.STATE = 501
) t
inner join workcase w 
  on W.ID = T1.WORKCASE_ID
where W.ID = 1683964476

Это позволит использовать неявное соединение в подзапросе, а затем вы будете использовать явное соединение с таблицей workcase .

Или, как @APC заявляет в комментариях, это также можно записать в виде CROSS JOIN :

select T1.ID, T2.ID 
from task T1
cross join task T2
inner join workcase w 
  on W.ID = T1.WORKCASE_ID
where W.ID = 1683964476
  and T1.STATE < 501
  and T2.STATE = 501
6
добавлено
@APC вы правы, я забыл об использовании cross join , я обновил свой ответ, чтобы включить это. Было слишком рано. :)
добавлено автор Taryn, источник
@APC у вас есть «я был слишком занят».
добавлено автор Taryn, источник
Это правильный ответ - мне нужно отозвать мой повторный голос. Более простым решением было бы заменить эту запятую в предложении FROM с помощью t1 cross join t2 . Это меньше печатает, и легче понять, что делает запрос. Кроме того, он сохраняет все соединения в одном синтаксисе.
добавлено автор APC, источник
Ну, мне удалось записать «как» два раза в два раза. Я печатал в обеденное время, поэтому у меня даже нет «слишком раннего» оправдания 8-)
добавлено автор APC, источник

как насчет чувствительности к регистру ??

Таблица была сглажена с использованием «t1», но после этого указана как «T1» после этого ...

Просто предложение ... :)

1
добавлено
Oracle имеет только регистр, если идентификатор находится в двойных кавычках. Это не вопрос в запросе, но может быть, когда таблица была создана.
добавлено автор APC, источник

Недопустимый идентификатор означает, что ваша таблица не имеет этого имени столбца (WORKCASE_ID)

1
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Oracle RU
Oracle RU
303 участник(ов)

Русскоязычная группа по Oracle. — Архитектура СУБД — PL/SQL — Оптимизация — Администрирование — Вакансии Oracle (указать инфу по вилке ЗП и удалёнке) Приглашайте коллег :-) Запрещены: личные оскорбления, обсуждения оффтопик вопросов политики и религии