Переписать запрос для предотвращения нескольких вызовов функции - PullRequest
1 голос
/ 28 марта 2012

Как бы я переписал этот запрос, чтобы он выполнялся, выполнив функцию SQL только один раз?

SELECT Top 1 Id, Name
  FROM Users U 
       INNER JOIN UserDetail D on U.Id = D.Id
       LEFT OUTER JOIN CreditCards C ON C.Id = U.Id AND UserHasCC(U.Id) = 1
       LEFT OUTER JOIN CreditCardDetails CD on C.CCID = C.CCID AND UserHasCC(U.Id) = 1
WHERE
       ((CD.active = 1 and UserHasCC(U.Id) = 1) OR UserHasCC(U.Id) = 0) and
       U.active = 1 and
       ((C.IsInternational = 1 and UserHasCC(U.Id) = 1) OR UserHasCC(U.id = 0)

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

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Исходя из вашего объяснения предполагаемого поведения запроса, я считаю, что это может быть близко:

SELECT Top 1 Id, Name
  FROM Users U 
       INNER JOIN UserDetail D on U.Id = D.Id
       LEFT OUTER JOIN CreditCards C ON C.Id = U.Id
       LEFT OUTER JOIN CreditCardDetails CD on C.CCID = C.CCID AND CD.Active = 1
WHERE U.Active = 1 and (c.id is null 
                        or (c.IsInternational = 1 
                            and UserHasCC(U.Id) = 1))

Я не мог быть уверен, но соединения и имена объектов подсказывают мне, что UserHasCC не имеет реальной ценности. Возможно, он инкапсулирует флаги из таблиц, не показанных здесь.

0 голосов
/ 28 марта 2012

Похоже, что он выполняет ту же логику.

 SELECT Top 1 Id, Name
  FROM Users U 
       INNER JOIN UserDetail D on U.Id = D.Id
       LEFT OUTER JOIN CreditCards C ON C.Id = U.Id 
       LEFT OUTER JOIN CreditCardDetails CD on C.CCID = C.CCID 
   WHERE
         U.active = 1
         AND
         (
             UserHasCC(U.Id) = 0
             OR
             (
                UserHasCC(U.Id) = 1
                and
                (
                  C.IsInternational = 1
                  OR
                  CD.active = 1
                )

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