ВЫБЕРИТЕ Это или То, но не оба - PullRequest
3 голосов
/ 26 января 2012

У меня очень сложный запрос, который заставляет мой мозг таять.

SELECT abunchOfStuff, r.xyz as netsell
FROM normalmtm n
JOIN mtmprogram m ON (
   m.mtmprogram = n.loanprogram
   AND m.investor = 'Xyzzy'
)
JOIN rates as r on (
    r.term >= '2012-01-01'
    AND r.investor = m.investor
    AND r.rate = n.rate
    AND r.program = m.basenormal
    AND r.clientcode = n.clientcode
)
LEFT OUTER JOIN mtmadjustments as ad ON (
    ad.loannumber = n.loannumber
    AND ad.investor = m.investor
)
WHERE n.loannumber = '12345678'
AND n.clientcode = 10
ORDER BY netsell DESC LIMIT 1

Это выбирает самую большую сеть из множества. Сложность в том, что я не могу полностью обернуть голову в том, что таблица ставок может совпадать или не совпадать с n.clientcode. Если это не совпадает, я хочу использовать код клиента 0, который по сути является подстановочным знаком.

Прямо сейчас я делаю запрос, специфичный для кода клиента, и если он ничего не возвращает, я делаю этот запрос снова с clientcode = 0 ... и кажется, что я мог бы каким-то образом объединить эти две вещи.

Я посмотрел на подзапрос EXISTS или NOT EXISTS, но я просто не мог понять, как использовать его в этом примере, и я даже не уверен, что это будет уместно.

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 26 января 2012
SELECT abunchOfStuff, ISNULL(r.xyz, r2.xyz) as netsell
FROM normalmtm n
JOIN mtmprogram m ON (
   m.mtmprogram = n.loanprogram
   AND m.investor = 'Xyzzy'
)
LEFT OUTER JOIN rates as r on (
    r.term >= '2012-01-01'
    AND r.investor = m.investor
    AND r.rate = n.rate
    AND r.program = m.basenormal
    AND r.clientcode = n.clientcode
)
LEFT OUTER JOIN rates as r2 on (
    r2.term >= '2012-01-01'
    AND r2.investor = m.investor
    AND r2.rate = n.rate
    AND r2.program = m.basenormal
    AND r2.clientcode = 0
)
LEFT OUTER JOIN mtmadjustments as ad ON (
    ad.loannumber = n.loannumber
    AND ad.investor = m.investor
)
WHERE n.loannumber = '12345678'
AND n.clientcode = 10
ORDER BY netsell DESC LIMIT 1
0 голосов
/ 26 января 2012

IFNULL (), примененный к клиентскому коду в соединении, должен помочь

 AND r.clientcode = IFNULL(0, n.clientcode)

РЕДАКТИРОВАТЬ : Возможно, я не полностью понял ваш вопрос ... вы говорите, что хотите нолькогда они не совпадают, поэтому изначально я предложил вариант, когда поле пустое, поэтому вы получите ноль, соответствующий коду r.clientcode.IFNULL выводит первое значение, когда второе равно нулю, или второе значение, когда оно не равно нулю, просто так.

Но, если вам нужно сделать 1.), проверьте, совпадают ли они, 2.) если они есть,присоединиться, 3.) если нет, присоединиться с нулевым значением ... вам может понадобиться подзапрос

 AND r.clientcode = ( IFNULL(0, select nn.clientcode FROM normalmtm nn where r.clientcode = nn.clientcode and nn.clientcode=n.clientcode) )

Что-то в этом роде, может быть ...

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