2013-04-26 98 views
0

我的目標是,在2013年查看所有的房地產觀衆和有計劃的觀看。 我相信我已經有90%的解決方案,但目前,這是行不通的。BETWEEN和JOIN

表使用

* 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

「它不起作用」是什麼意思?你得到一個錯誤,或不是預期的結果?你真的在'from'中的'yr_viewing'和'yr_viewer'之間做了舊式的連接,然後再用'join'加入到'yr_viewing'中?哪個'dateviewed'是where子句應該使用的? – 2013-04-26 16:59:35

回答

1

您的連接有一些問題。您正在與yr_viewer交叉加入yr_viewing,然後您再次加入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' 

編輯:雙引號(由Alex建議)

+0

在'to_char(dateviewed,...)過濾'將停止使用該列上的任何索引。 – 2013-04-26 17:03:34

+0

他沒有提到索引,但是這可以通過基於函數的索引來解決。 – gustavodidomenico 2013-04-26 17:05:31

+0

爲什麼不直接使用日期範圍,並將日期當作日期處理?不可否認的是,如果沒有時間分量(或者一年中最後一天的任何事情將被錯過),OP使用的「之間」纔會起作用。這似乎不是一個很好的習慣。添加一個FBI似乎相當多的開銷*如果*列上已經有一個正常的索引。 (它也應該是「YYYY'',而不是雙引號爲」YYYY「;並且可以說你應該使用''2013''它將它視爲一個字符串)。 – 2013-04-26 17:11:07

0

免責聲明:我沒有任何Oracle經驗,但我處理MySQL和SQL Server很多,所以這可能會或可能無法正常工作。

你確定應該使用內連接而不是左連接嗎?使用內部連接只會顯示結果,顯示既是客戶又是查看者。

你的說法似乎有點古怪太...你正在做一個隱式連接,然後通過一個明確的內跟隨它一起同桌......

也許這樣的事情會更好地工作:

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' 
;