0

我是 sql 新手,并试图调整别人的巨大存储过程以获得结果的子集。下面的代码可能是整个过程的 10%。我添加了 lp.posting_date、last left join 和 where 子句。尝试获取发布日期在开始日期和结束日期之间的记录。我这样做对吗?显然不是因为结果不受更改的影响。更新:我改变了最后的加入。如果只有一个区域分配项,则结果是正确的。如果有多个区域分配术语,则每个术语的结果都重复。

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
4

4 回答 4

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

如果这得到了您想要的,那么您可以从那里开始工作并将其他左连接添加到查询中(如果您将其复制回您的过程中,则摆脱选择 * 和“删除表”)。如果没有,请查看您的布尔日期逻辑或为我们提供更多详细信息。如果您不熟悉 sql 及其过程扩展,请尝试使用对象资源管理器检查您正在查询的列的属性,并尝试从您正在使用的表中选择前 1000 个 * 以了解数据的样子构建查询时。-麦克风

于 2013-08-27T21:05:22.010 回答
1

正如可能已经暗示的那样,在将 WHERE 子句与 OUTER JOIN 一起使用时应该小心。

OUTER JOIN 的想法是选择性地连接该表并提供对列的访问。JOINS 将生成您的集合,然后运行 ​​WHERE 子句来限制您的集合。如果您在 WHERE 子句中使用一个条件,说明您的外部连接表中的列之一必须存在/等于一个值,那么根据您的查询的性质,您不再执行 LEFT JOIN,因为您只检索该行加入发生。

于 2013-08-27T21:26:29.180 回答
0

事实证明,这个问题更容易解决,而且它在存储过程中的不同位置。我所要做的就是在其中一个光标上添加一行,以包括按日期划分的区域术语分配。

于 2013-09-10T21:47:14.683 回答
0

您也可以尝试 BETWEEN 运算符

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

推理:您可能会遇到表中没有匹配值的问题。在左连接的那个实例中,表将填充空值。使用“BETWEEN”运算符可确保所有返回值都在范围之间,并且不会出现空值。

于 2013-08-27T20:35:26.233 回答