代码之家  ›  专栏  ›  技术社区  ›  Max Boy

使用ColdFusion查询性能

  •  1
  • Max Boy  · 技术社区  · 6 年前

    我在一个旧项目中使用ColdFusion,我对查询有问题。我需要列出我的单元表中的所有单元,以及每个单元的所有租户付款。它是使用循环内部循环构建的,这使得速度非常慢(代码如下所示):

        <!-- This query returns 511 Units -->
    <cfquery name="getPropertyUnits" dataSource="rent">
        Select t.TenantID, u.UnitName
        From Units u
        INNER JOIN Tenants t on U.UnitID = t.UnitID
        Where u.Occupied = 1
        and u.PropertyID = 8
        and t.Prospect = 2
        Order By u.UnitName
    </cfquery>
    
    <!-- Loop the query getPropertyUnits -->
    <cfloop query="getPropertyUnits">
    
        <!-- Each loop interaction, I get the transactions -->
        <!-- Just hard code date for testing -->
        <cfquery dataSource="rent" name="getTransactions">
                Select * From TenantTransactions
                Where TenantID = #TenantID#
                AND TenantTransactionDate BETWEEN '2018-05-01' AND '2018-05-23'
                Order By TenantTransactionDate
        </cfquery>
    
        <!-- Loop the second query -->
        <cfloop query="getPropertyUnits">
            <!-- Work with data -->
        </cfloop>
    
    </cfloop>
    

    有没有一种方法只进行一次查询并获取所有数据?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  5
  •   Community holdenweb    6 年前

    您可以联接所有三个表:

    SELECT  t.TenantID, u.UnitName, tt.*
      FROM  Units u
            INNER JOIN Tenants t ON U.UnitID = t.UnitID
            LEFT JOIN TenantTransactions tt ON tt.tenantid = t.id
        AND tt.TenantTransactionDate BETWEEN '2018-05-01' AND '2018-05-23'
      WHERE u.Occupied = 1
        AND u.PropertyID = 8
        AND t.Prospect = 2
      ORDER BY u.UnitName, tt.TenantTransactionDate
    

    记住前两列( t.TenantID , u.UnitName )将重复多次:在 TenantTransactions 表。您需要在应用程序中将它们分组。简单的逻辑就可以了。

    无论如何,这个查询比现在做的快得多。

    此外,如果租户没有交易,则 tt.* 列将全部为空。记住这一点,因为它使用 left join 。这种连接对于确保显示所有租户都是必要的,不管他们是否有交易。