2013-08-27 76 views
0

我是新來的sql,並試圖調整其他人的巨大存儲過程來獲得結果的子集。下面的代碼可能是整個程序的10%。我添加了lp.posting_date,最後一個左連接和where子句。嘗試獲取記錄日期在開始日期和結束日期之間的記錄。我做對了嗎?顯然不是因爲結果不受變化影響。更新:我改變了最後的加入。如果只有一個區域分配期限,結果是正確的。如果有多個區域分配術語,則每個術語的結果都是重複的。多個SQL連接不會產生預期的結果

SELECT Distinct 
l.lease_id , 
l.property_id as property_id, 
l.lease_number as LeaseNumber, 
l.name as LeaseName, 
lty.name as LeaseType, 
lst.name as LeaseStatus, 
l.possession_date as PossessionDate, 
l.rent as RentCommencementDate, 
l.store_open_date as StoreOpenDate, 
msr.description as MeasureUnit, 
l.comments as Comments , 
lat.start_date as atStartDate, 
lat.end_date as atEndDate, 
lat.rentable_area as Rentable, 
lat.usable_area as Usable, 
laat.start_date as aatStartDate, 
laat.end_date as aatEndDate, 
MK.Path as OrgPath, 
CAST(laa.percentage as numeric(9,2)) as Percentage, 
laa.rentable_area as aaRentable, 
laa.usable_area as aaUsable, 
laa.headcounts as Headcount, 
laa.area_allocation_term_id, 
lat.area_term_id, 
laa.area_allocation_id, 
lp.posting_date 
INTO #LEASES FROM la_tbl_lease l 
INNER JOIN #LEASEID on l.lease_id=#LEASEID.lease_id 
INNER JOIN la_tbl_lease_term lt on lt.lease_id=l.lease_id and lt.IsDeleted=0 
LEFT JOIN la_tlu_lease_type lty on lty.lease_type_id=l.lease_type_id and lty.IsDeleted=0 
LEFT JOIN la_tlu_lease_status lst on lst.status_id= l.status_id 
LEFT JOIN la_tbl_area_group lag on lag.lease_id=l.lease_id 
LEFT JOIN fnd_tlu_unit_measure msr on msr.unit_measure_key=lag.unit_measure_key 
LEFT JOIN la_tbl_area_term lat on lat.lease_id=l.lease_id and lat.isDeleted=0 
LEFT JOIN la_tbl_area_allocat_term laat on laat.area_term_id=lat.area_term_id and laat.isDeleted=0 
LEFT JOIN dbo.la_tbl_area_allocation laa on laa.area_allocation_term_id=laat.area_allocation_term_id and laa.isDeleted=0 
LEFT JOIN vw_FND_TLU_Menu_Key MK on menu_type_id_key=2 and isActive=1 and id=laa.menu_id_key 
INNER JOIN la_tbl_lease_projection lp on lp.lease_projection_id = #LEASEID.lease_projection_id 
where lp.posting_date <= laat.end_date and lp.posting_date >= laat.start_date 
+0

沒有表格定義和上下文,它只是猜測。 –

+0

雖然你的左連接和條件都看起來很完美,但要確定這樣的確切問題是非常困難的。此外,而不是左加入,嘗試使用內部連接,看看你是否得到正確的結果。 – Sonam

+0

嘗試了內部連接但沒有運氣。 – user2414509

回答

0

您可以嘗試BETWEEN運算以及

Where lp.posting_date BETWEEN laat.start_date AND laat.end_date 

推理:你可以有問題何在有一個表中沒有匹配值。在左側連接的情況下,該表將填充爲空。使用'BETWEEN'運算符可確保所有返回的值在該範圍之間,且無空位可以滑入。

1

將其縮短並將其作爲新查詢複製到ssms或用於測試的任何內容中。除非要保留​​左側的集合,即使沒有匹配的lp.lease_id,也要使用內部連接。嘗試類似

if object_id('tempdb..#leases) is not null 
    drop table #leases; 
select distinct 
l.lease_id 
,l.property_id as property_id 
,lp.posting_date 

into #leases 
from la_tbl_lease as l 
inner join la_tbl_lease_projection as lp on lp.lease_id = l.lease_id 

where lp.posting_date <= laat.end_date and lp.posting_date >= laat.start_date 

select * from #leases 

drop table #leases 

如果這讓你想要的東西,那麼你可以從那裏工作,並添加其他左翼加入到查詢(擺脫選擇的*和「DROP TABLE」如果你將它複製回你的PROC)。如果它沒有,那麼看看你的布爾日期邏輯或爲我們提供更多的細節。如果您不熟悉sql及其過程擴展,請嘗試使用對象資源管理器來檢查您正在查詢的列的屬性,然後嘗試從正在使用的表中選擇前1000 *以瞭解數據的外觀當建立查詢時。 -Mike

1

正如可能已經暗示的那樣,在使用帶有OUTER JOIN的WHERE子句時應該小心。

OUTER JOIN的想法是可選地加入該表並提供對列的訪問。 連接將生成您的設置,然後將運行WHERE子句來限制您的設置。如果你在WHERE子句中使用一個條件,說你的外部連接表中的一個列必須存在/等於一個值,那麼就你的查詢的性質而言,你不再執行LEFT JOIN,因爲你只需要檢索行連接發生。

0

事實證明,這個問題比較容易解決,而且它在存儲過程中處於不同的位置。我所要做的只是在其中一個遊標中添加一行,以便按日期包含區域期限分配。

相關問題