У меня возникли проблемы с этим.Запрос с левым наружным соединением
Согласно Jeff Atwood A Visual Explanation of SQL Joins Левое внешнее соединение дает полный набор записей из таблицы A с соответствующими записями (если таковые имеются) в таблице B. Если совпадения нет, правая часть будет содержать нуль.
В левой таблице (TableA) нет дубликатов. В правом столеB имеется 1 или 2 записи для каждого номера клиента. PrimaryTP обозначает один как первичный с 1, а другой имеет 0.
Мне не нужно включать строку And B.PrimaryTP = 1
, потому что TableA не имеет дубликатов. Но если я оставлю это, я получаю дубликаты клиентских номеров. Зачем?
Можете ли вы помочь мне понять, как это работает. Это очень смущает меня. Логика And B.PrimaryTP = 1
ускользает от меня. Но, похоже, это работает. Тем не менее, я боюсь доверять этому, если я этого не понимаю. Можете ли вы помочь мне понять это. Или у меня есть логическая ошибка, скрытая в запросе?
SELECT A.ClientNum --returns a list with no duplicate client numbers
FROM (...<TableA>
) as A
Left Outer Join
<TableB> as B
on A.ClientNum = B.ClientNum
--eliminate mismatch of (ClientNum <> FolderNum)
Where A.ClientNum Not In
(
Select ClientNum From <TableB>
Where ClientNum Is Not Null
And ClientNum <> IsNull(FolderNum, '')
)
--eliminate case where B.PrimaryTP <> 1
And B.PrimaryTP = 1
Wow! Спасибо за помощь. Теперь имеет смысл, как многократные записи по праву вызывают дубликаты. Благодарю. –