2013-04-28 62 views
1

我在加入以下語句時遇到了一些困難。在SQL中加入三個表的難度ORACLE

Select * 
From yr_property 
Left Join yr_lease on yr_lease.propertynum = yr_property.propertynum 
Where yr_lease.leasenum is null; 



Select Dateto 
From yr_advert; 

我試圖連接表,但我不認爲一切都是完全正確的

left join yr_advert on yr_advert.propertynum = yr_property.propertynum 

我的目標,以...

列表性能不在出租日期他們是最後廣告(上次廣告日期停止)。

表中使用

yr_property

Propertynum , CHAR(5), NOT nullable (PRIMARY KEY 1) 
Street , VARCHAR(25),  nullable 
Area , VARCHAR2(15),  nullable 
City , VARCHAR2(15),  nullable 
Postcode , VARCHAR2(8), nullable 
Prop_type , VARCHAR2(15), nullable 
Rooms NUMBER , (2,0),  nullable 
Staffnum , CHAR(5),  nullable 
Branchnum , CHAR(3)  nullable 
Ownernum , CHAR(5)   nullable 
Comments , VARCHAR2(500) nullable 
Date_ended , DATE   nullable **FORMAT EG - 11/JAN/2004** 

yr_lease

Leasenum , CHAR(5),   NOT nullable (PRIMARY KEY 1) 
Renternum, , CHAR(5),  nullable 
Propertynum , CHAR(5),  nullable (FOREIGN KEY) 
Paymentmethod , VARCHAR2(15),nullable 
Rent , NUMBER(17,2),   nullable 
Depositamount , NUMBER(15), nullable 
Depositpaid , VARCHAR2(5), nullable 
Rentstart , DATE    nullable 
Rentfinish , DATE   nullable **FORMAT EG - 11/JAN/2004** 

yr_advert

ADVERTNUM , CHAR(10), NOT nullable (PRIMARY KEY 1) 
PROPERTYNUM , CHAR(5),  NOT nullable (PRIMARY KEY 2) 
STAFFNUM , CHAR(5),   nullable 
TOAPPEAR , VARCHAR2(100), nullable 
DATEFROM , DATE,    nullable 
DATETO , DATE ,    nullable **FORMAT EG - 11/JAN/2004** 
WORDS, VARCHAR2(500),  nullable 

謝謝你的任何幫助,我可能會收到。

+0

你說'列出沒有出租的物業並附上他們上次的廣告日期.'但是這看起來不太正確,因爲租賃和AdVerts都是日期*範圍*。你的意思是「*日期範圍內的*」? – RBarryYoung 2013-04-28 16:46:37

+2

針對日期列的註釋很好奇,因爲Oracle日期不是以格式存儲的,格式取決於NLS_DATE_FORMAT值,或者用於To_Char()函數。 – 2013-04-28 17:36:21

回答

1

此查詢的目的是查找在最後一個廣告期間尚未捆綁的屬性。

SELECT * 
FROM yr_property A 
INNER JOIN yr_advert B ON A.propertynum = B.propertynum 
LEFT JOIN yr_lease C ON B.propertynum = C.propertynum AND (C.rentstart BETWEEN B.datefrom AND B.dateto OR C.rentfinish BETWEEN B.datefrom AND B.dateto) 
WHERE B.dateto = (SELECT MAX(D.dateto) FROM yr_advert D WHERE A.propertynum = D.propertynum) 
    AND C.leasenum IS NULL; 

替代查詢:

SELECT * 
FROM yr_property A 
INNER JOIN yr_advert B ON A.propertynum = B.propertynum 
WHERE B.dateto = (SELECT MAX(C.dateto) FROM yr_advert C WHERE A.propertynum = C.propertynum) 
    AND NOT EXISTS (SELECT 1 FROM yr_lease D WHERE A.propertynum = D.propertynum AND (D.rentstart BETWEEN B.datefrom AND B.dateto OR D.rentfinish BETWEEN B.datefrom AND B.dateto)); 

我不太確定哪些查詢是數據庫性能的事更好。