Запрос производительности с помощью ColdFusion - PullRequest
0 голосов
/ 24 мая 2018

Я использую 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 Ответ

0 голосов
/ 24 мая 2018

Вы можете объединить все три таблицы:

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.Этот тип объединения необходим для обеспечения отображения всех арендаторов независимо от того, имеют ли они транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...