【发布时间】:2013-11-12 16:45:51
【问题描述】:
我无法弄清楚这一点。
根据 Jeff Atwood A Visual Explanation of SQL Joins 的说法,左外连接从表 A 中生成一组完整的记录,匹配的记录(如果可用)在表 B 中。如果没有匹配项,则右侧将包含 null。
左表 (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
【问题讨论】:
-
哇!感谢所有的帮助。现在,正确的多个记录如何导致重复是有道理的。谢谢。
标签: sql-server tsql