2013-04-26 40 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' 
;