Еще один вопрос о присоединении - PullRequest
1 голос
/ 22 сентября 2009

Я хочу получить информацию о кредите. Одна часть информации - это определенная сумма комиссии. Если я упросту свой запрос до номера кредита и суммы комиссии, я все равно не смогу это выяснить. Первый запрос возвращает то, что я ожидаю, один номер займа и 0 для суммы комиссии (плата не взималась), а во втором я не могу работать ни ради любви, ни за деньги. Он будет возвращать только пустой набор результатов независимо от того, какой тип соединения я пытаюсь применить. Использование SQL Server 2005, если это имеет значение.
спасибо за ваше время.

ура Боб

select 
  tblLoan.loanID as LoanNumber
 ,isnull(tblgfe1300.gfe1300feeTot,0) as RepairFunds
from
  tblLoan
LEFT JOIN tblgfe1300 on tblgfe1300.loanID = tblLoan.loanID AND tblgfe1300.gfe1300FeeName = 'Escrow Holdback'
WHERE tblLoan.loanID = '3250000167'

Теперь это тот, который не работает.

select 
  tblLoan.loanID as LoanNumber
  ,isnull(tblgfe1300.gfe1300feeTot,0) as RepairFunds
from
  tblLoan
  LEFT JOIN tblgfe1300 on  tblgfe1300.loanID = tblLoan.loanID
where
  tblLoan.loanID = '3250000167'
  AND tblgfe1300.gfe1300FeeName = 'Escrow Holdback'

Ответы [ 3 ]

1 голос
/ 22 сентября 2009

Я считаю, что в таблице tblgfe1300 у вас нет записи с указанным идентификатором и feename = "escrow holdback".

Причина, по которой первый запрос возвращает результат, состоит в том, что ваше условие для столбца gfe1300FeeName возникает «во время соединения», и, поскольку вы используете левое соединение, все результаты будут содержаться в наборе результатов. После этого результирующий набор фильтруется по Id, и столбец gfe1300FeeName больше не учитывается.

Во 2-м запросе 2-й столбец учитывается после применения объединения. Таким образом, если у вас есть одна запись для указанного Id, но значение в столбце gfe1300FeeName не равно «Escrow Holdback», эта запись будет исключена из набора результатов.

0 голосов
/ 22 сентября 2009

Этот запрос:

select L.loanID LoanNumber, 
   isnull(F.gfe1300feeTot, 0) RepairFunds
from tblLoan L 
   LEFT JOIN tblgfe1300 F
      on F.loanID = L.loanID
where L.loanID = '3250000167'  
    AND F.gfe1300FeeName = 'Escrow Holdback'

не возвращает строк, потому что выражение F.gfe1300FeeName находится в предложении Where, а не в Join.

При использовании внешних объединений применяется условие объединения (но строки не совпадают), а затем все строки, которые находятся на внутренней стороне внешнего соединения, но не имеют совпадающей строки в таблице на "внешнем" side добавляются обратно, но со значениями NULL для всех столбцов, которые должны были прийти из строки [not -isting] во внешней таблице. Затем (поскольку вы фильтруете по столбцу в этой внешней таблице tblgfe1300), ваше предложение Where фильтрует OUT эти строки, потому что значение там (NULL) не равно 'Escrow Holdback'

0 голосов
/ 22 сентября 2009

Если объединение не имеет никакого эффекта, у вас все еще есть tbl.loanID в результате. Но если вы отфильтруете с WHERE, то у вас не будет результатов.

Вы можете проверить это, добавив WHERE tblgfe1300.gfe1300FeeName = 'Escrow Holdback' к первому запросу, и тогда вы тоже ничего не получите.

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