2013-08-27 73 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

事实证明,这个问题比较容易解决,而且它在存储过程中处于不同的位置。我所要做的只是在其中一个游标中添加一行,以便按日期包含区域期限分配。

相关问题