1

次のステートメントに参加するのに苦労しています。

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**

年リース

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

私が受け取るかもしれない助けをありがとう。

4

1 に答える 1

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

データベースのパフォーマンスに関して、どちらのクエリが優れているかはよくわかりません。

于 2013-04-28T17:51:03.027 に答える