2013-01-22 2 views
0

Вот мой запрос. v.location - это столбец, который содержит информацию о полу и помещении, то есть FL 2 RM 204. Мне нужно сравнить это с таблицей mv_rooms, которая разделяет комнату и пол на две отдельные столбцы.Недопустимый идентификатор при использовании сравнения объединенного соединения

select v.location, v.customer_name, v.street_name 
from voip_validate v, mv_rooms r, mv_buildings b 
left outer join voip_validate 
on v.location = 'FL ' || r.floor || ' RM ' || r.room 
where 'FL ' || r.floor || ' RM ' || r.room is null 
and b.dps_number = r.dps_number; 

Когда я выполнить запрос, я получаю сообщение об ошибке:

ORA-00904: "R" "ROOM": недопустимый идентификатор 00904. 00000 -. "% S: неверный идентификатор" * Причина:
* Действие: Ошибка в строке: 4 Колонка: 47

+0

Вы смешиваете стили синтаксиса ANSI. Используйте один стиль и придерживайтесь его. – Wolf

ответ

1

Вы смешиваете синтаксис соединения oracle и ANSI.

select v.location, v.customer_name, v.street_name 
    from voip_validate v 
     left outer join mv_rooms r 
        on v.location = 'FL ' || r.floor || ' RM ' || r.room 
     left outer join mv_buildings b 
       on b.dps_number = r.dps_number 
where r.room is null 

Кроме того, ваше предложение where совершенно неверно, поскольку оно никогда не может быть пустым.

where 'FL ' || r.floor || ' RM ' || r.room is null 

были ли вы намерены возвращать строки, которые не имели соответствующего ряда в «V»?

+0

Я хочу вернуть строки в V, которые не совпадают с строками в R. –

+0

@GeoffDawdy ah ok, я внесла поправки в мой пример для этого раунда. Я предположил, что r.room - это поле с нулевым значением. если нет, поместите 'where r.room' как ничтожный (например, один из столбцов PK) столбцы – DazzaL

+0

спасибо. Вот код, который я использую, и по большей части я верю, что он возвращает записи, которые я ищу. выберите v.location, v.customer_name, v.street_name from voip_validate v left external join mv_rooms r on v.location = 'FL' || r.floor || 'RM' || r.room left external join mv_dps_buildings b on b.dps_building_number = r.dps_building_number где r.room is null и r.floor is null; –

1

Существует, безусловно, проблема с ИНЕК, , как вам нужно, чтобы проверить пол поле и поле номера для NULL, а не вся строка ,

select v.location, v.customer_name, v.street_name 
from voip_validate v, mv_rooms r, mv_buildings b 
left outer join voip_validate 
on v.location = 'FL ' || r.floor || ' RM ' || r.room 
where (r.floor is null or r.room is null) 
and b.dps_number = r.dps_number; 

Возможно, проблема в том, что пол и/или помещение являются целыми типами данных. Преобразуйте их в строки.

+0

Я все еще получаю недопустимый идентификатор. Может быть, мои колонки r.floor и r.room имеют тип VARCHAR2 (4 байт) и VARCHAR2 (8 байт), но мои v.locations - VARCHAR2 (60 байт)? –

+0

Я только что понял другую проблему. Поскольку предложение where находит записи, где пол или номер пуста, вы не можете выполнить конкатенацию строки. Попробуйте изменить значение null на значение не равно null, а затем попробуйте оставить части SQL, пока вы не сможете избавиться от этой ошибки. Это должно сосредоточиться на проблеме. –

+0

Хотя ваше решение не является выбранным ответом, я считаю, что вы помогли мне выявить некоторые проблемы. Спасибо за вашу помощь. –

Смежные вопросы