1

我很难弄清楚这一点。

根据 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 
4

5 回答 5

1

INNER JOINan和 a的区别LEFT JOIN只是LEFT JOIN当表 B 中没有对应的行时,仍然返回表 A 中的行。

但它仍然是 a JOIN,这意味着如果表 B 中有多个对应的行,它会将表 A 中的行连接到其中的每一行

因此,如果您想确保表 A 中的每一行不超过一个结果,则必须确保从表 B 中找到不超过一行 - 因此And B.PrimaryTP = 1.

于 2013-11-12T16:50:32.963 回答
1

如果您在 A 中有一个客户编号,而在表 B 中有两个匹配项,那么您将得到重复。

假设您有以下数据,

Table-A(client Num) Table-B(client Num)
1          2
2          2

The left Join Results

Table-A(client Num) Table-B(client Num)
1                       (null)
2                       2
2                       2

这就是重复的原因。因此,您需要从表 B 中获取不同的值或对结果集执行 Distinct。

于 2013-11-12T16:56:56.113 回答
1

我不应该包含 And B.PrimaryTP = 1 行,因为 TableA 没有重复项。然而,如果我把它遗漏掉,我会得到重复的客户号码。为什么?

因为右表中的两行都匹配左表中的一行。SQL Server 无法输出三角形结果;它必须为每个连接行显示两个表中的列。对于 INNER JOIN 也是如此。

DECLARE @a TABLE(a INT);
DECLARE @b TABLE(b INT);

INSERT @a VALUES(1),(2);
INSERT @b VALUES(1),(1);

SELECT a.a, b.b FROM @a AS a 
LEFT OUTER JOIN @b AS b ON a.a = b.b;

SELECT a.a, b.b FROM @a AS a 
INNER JOIN @b AS b ON a.a = b.b;

结果:

a   b
--  ----
1   1
1   1
2   NULL

a   b
--  --
1   1
1   1
于 2013-11-12T16:57:21.873 回答
1

在你给连接的链接上解释得很好。所以问题是您有来自表 A 的几条记录(无论是否有重复),对于 A 中的 1 条记录,B 中有 2 条记录(在某些情况下)。为避免这种情况,您可以使用任一子DISTINCT句,任一子GROUP BY句。

于 2013-11-12T16:57:59.917 回答
0

LEFT OUTER JOIN将为您提供来自的所有记录以及来自的A所有匹配记录B。与 an 的不同之INNER JOIN处在于,如果 B 中没有匹配的记录,则INNER连接将完全忽略 A 中的记录,而LEFT连接仍将包含来自 的结果的行A

但是,在您的情况下,您可能还想查看DISTINCT关键字。

于 2013-11-12T16:51:59.307 回答