2013-11-21 33 views
0

在下面的查询中,我们将根据“property_id”在“move_out_date”上添加天数。加入以下SQL查询的替代

我们已经写下面的查询,它工作正常。

但问题是,如果有N个,我们需要使用加入了N次(在下面情况下,只有2个属性)的属性数量。

有没有更好的和优化的方法来完成它?

SELECT 
    * 
FROM 
    leases l 
    JOIN lease_processes lp ON (lp.management_company_id = l.management_company_id AND lp.lease_id = l.id AND lp.customer_id IS NULL) 
    JOIN lease_customers lc ON (lc.management_company_id = l.management_company_id AND lc.lease_id = l.id AND lc.customer_id = l.primary_customer_id) 
WHERE 
    l.management_company_id = 2636 
    AND lp.fmo_processed_on IS NULL 
    AND lc.lease_status_type_id = 6 
    AND (lp.move_out_date + INTERVAL '5 day' <= date(NOW()) AND l.property_id = 28949) 

UNION 

SELECT 
    * 
FROM 
    leases l 
    JOIN lease_processes lp ON (lp.management_company_id = l.management_company_id AND lp.lease_id = l.id AND lp.customer_id IS NULL) 
    JOIN lease_customers lc ON (lc.management_company_id = l.management_company_id AND lc.lease_id = l.id AND lc.customer_id = l.primary_customer_id) 
WHERE 
    l.management_company_id = 2636 
    AND lp.fmo_processed_on IS NULL 
    AND lc.lease_status_type_id = 6 
    AND (lp.move_out_date + INTERVAL '1 day' <= date(NOW()) AND l.property_id = 28098) 

回答

0

您可能想要考虑编辑您的标签,以便我们可以真实地告诉您的环境是什么。

除非我错过了一些你没有触及连接条件,只是改变where子句。情况就是这样,你可以使用像CASE这样的适当的条件或更适当的方法,你可以将文字间隔值('1 day'等)保存到相关属性的租约表记录的属性中,然后过滤一次计算值。

SELECT 
    * 
FROM 
    leases l 
    JOIN lease_processes lp ON (lp.management_company_id = l.management_company_id AND lp.lease_id = l.id AND lp.customer_id IS NULL) 
    JOIN lease_customers lc ON (lc.management_company_id = l.management_company_id AND lc.lease_id = l.id AND lc.customer_id = l.primary_customer_id) 
WHERE 
    l.management_company_id = 2636 
    AND lp.fmo_processed_on IS NULL 
    AND lc.lease_status_type_id = 6 
    AND (lp.move_out_date + l.property_moveout_interval <= date(NOW()) 
AND l.property_id in var_some_aggregated_ID_list) 
+0

这是PostgreSQL的。我猜上述查询不会工作,因为property_moveout_interval对于所有属性都不相同。 –

1
SELECT 
    * 
FROM 
    leases l 
    JOIN lease_processes lp ON (lp.management_company_id = l.management_company_id AND lp.lease_id = l.id AND lp.customer_id IS NULL) 
    JOIN lease_customers lc ON (lc.management_company_id = l.management_company_id AND lc.lease_id = l.id AND lc.customer_id = l.primary_customer_id) 
WHERE 
    l.management_company_id = 2636 
    AND lp.fmo_processed_on IS NULL 
    AND lc.lease_status_type_id = 6 
    AND ((lp.move_out_date + INTERVAL '5 day' <= date(NOW())) OR (lp.move_out_date + INTERVAL '1 day' <= date(NOW()))) 
    AND l.property_id = 28949