2013-04-26 2 views
0

Моя цель состоит в том, чтобы просмотреть все посетителя недвижимости и запланированные просмотры в 2013 году. Я считаю, что у меня есть 90% пути к решению, но на данный момент это не работает.МЕЖДУ И ПРИСОЕДИНЯЙТЕСЬ

Таблицы в использовании

* yr_viewer *

Clientnum, CHAR(5), NOT nullable (PRIMARY KEY 1) 
Branchnum, CHAR(3), NOT nullable (PRIMARY KEY 2) 
Prefferedtype, VARCHAR2(15), nullable 
MAXIMUMRENT, NUMBER (17,2), nullable 
Finished, NUMBER(1,0), nullable 

yr_viewing

propertynum, CHAR(5), NOT nullable (PRIMARY KEY 1) 
dateviewed, Date nullable (format - 1-jan-2013) 
Clientnum, CHAR(5), NOT nullable (PRIMARY KEY 2) 
Staffnum, CHAR(5), nullable 
Comments, VARCHAR2 (300), nullable 

yr_Client

Clientnum, CHAR(5), NOT nullable (PRIMARY KEY 1) 
Firstname Varchar2(20), nullable 
Lastname Varchar2(20), nullable 
Address Varchar2(50), nullable 
Telephonenum Char (13), nullable 

Мой запрос

select distinct c.Firstname, c.Lastname, v.PropertyNum, v.DateViewed 
from yr_viewing, yr_viewer i 
     inner join YR_VIEWING v 
     on i.ClientNum = v.ClientNum 
     inner join YR_CLIENT c 
     on i.ClientNum = c.ClientNum 
where dateviewed between '01-jan-2013' and '31-dec-2013' 
+2

Что значит «не работает» означает? Вы получаете ошибку или ожидаемые результаты? Вы действительно выполняете старое соединение между 'yr_viewing' и' yr_viewer' в 'from', а затем снова присоединяетесь к' yr_viewing' с 'join'? Какой 'dateviewed' является предложением' where', которое предполагается использовать? –

ответ

1

Есть проблемы с вашими объединениями. Вы перекрестном Соединиться yr_viewing с yr_viewer, то вы присоединяетесь к концу в yr_viewing.

Вы не вытаскиваете ни одного столбца из yr_viewer, поэтому полностью исключайте его из запроса. И вам не нужно включать yr_viewing дважды. Попробуйте что-то вроде этого:

select distinct c.Firstname, c.Lastname, v.PropertyNum, v.DateViewed 
    from yr_viewing v 
    inner join YR_CLIENT c on i.ClientNum = c.ClientNum 
    where dateviewed between '01-jan-2013' and '31-dec-2013' 

более, что один: ваши даты будет работать только тогда, когда Oracle NLS_DATE_FORMAT установлен в DD-MON-YYYY, который он обычно не является. Даже если это вам не следует доверять. Лучше использовать даты ANSI литералов и изменить положение WHERE следующим образом:

where dateviewed between DATE '2013-01-01' and DATE '2013-12-31' 
1

Ответ:

select distinct c.Firstname, c.Lastname, v.PropertyNum, v.DateViewed 
    from yr_viewer VV 
inner join YR_VIEWING v 
    on VV.ClientNum = v.ClientNum 
inner join YR_CLIENT c 
    on V.ClientNum = c.ClientNum 
where TO_CHAR(dateviewed, 'yyyy') = '2013' 

Edit: двойные кавычки (предложение Алексом)

+0

Фильтрация на 'to_char (dateviewed, ...)' останавливает любой индекс в используемом столбце. –

+0

Он не упоминает индексы, но это может быть разрешено с помощью функционального индекса. – gustavodidomenico

+0

Почему бы не просто использовать диапазон дат, а обрабатывать даты как даты?По общему признанию, «между» OP использует только работу, если нет компонента времени (или что-либо в последний день года будет пропущено). Это не кажется большой привычкой. Добавление FBI кажется довольно большим накладным *, если * в столбце уже есть нормальный индекс. (Это также должно быть «ГГГГ», а не двойным кавычком как «ГГГГ», и, возможно, вы должны использовать «2013», потому что вы рассматриваете его как строку). –

0

отказ от ответственности: У меня нет никакого опыта оракула, но я очень много разбираюсь с сервером mysql и sql, так что это может работать или не работать.

Вы уверены, что должны использовать внутренние соединения вместо левых соединений? Использование внутренних объединений будет отображать только те результаты, которые показываются людям, которые одновременно являются клиентами и просматривают.

Ваше утверждение кажется немного напуганный тоже ... Вы делаете неявное присоединиться, то следующие его явно заданное внутреннее соединение в той же таблице ...

может быть что-то, как это будет работать лучше:

select distinct c.Firstname, c.Lastname, v.PropertyNum, v.DateViewed 
from yr_viewing v 
LEFT JOIN yr_viewer i 
on i.ClientNum = v.ClientNum 
LEFT JOIN YR_CLIENT c 
on i.ClientNum = c.ClientNum 
where dateviewed 
between '01-jan-2013' and '31-dec-2013' 
; 
Смежные вопросы