具有相同计数值的两个表之间的内部联接

Posted

技术标签:

【中文标题】具有相同计数值的两个表之间的内部联接【英文标题】:Inner join between two tables with same count values 【发布时间】:2014-04-08 22:31:07 【问题描述】:

我从 2 天以来一直在研究这个问题。

我有两个使用 SQL Select 语句创建的表

SELECT (


) Target

INNER JOIN

SELECT (


) Source

ON Join condition 1
AND Join condition 2
AND Join condition 3
AND Join condition 4
AND Join condition 5

目标表的计数值为 10,000 条记录。 源表的计数值为 10,000 条记录。

但是当我在 5 个连接条件下对两个表进行内部连接时

我得到了 9573 条记录。

我基本上是想在源表和目标表之间找到一对一的匹配。我觉得目标中的每个字段都匹配源中的每个字段。

问题:

    为什么即使两个表中的记录值相同,我的内部联接也会提供较少的记录? 如果符合预期,如何确保在加入条件后获得准确的 10,000 条记录?

【问题讨论】:

【参考方案1】:

1) INNER JOIN 只输出连接列匹配的两个表的 JOINING 行。因此,在您的情况下,两个表中的行中可能都不存在 Join Condition1 ,因此某些行被过滤掉了。

2)正如另一张海报提到的那样,左连接是一种方式。您需要查看要用作主表的表源或目标,即从所有这些行开始并返回。然后,您根据您的条件离开连接剩余的表,以添加您连接条件匹配的所有列。

如果您向我们提供您正在处理的表和您尝试实现的查询\结果,这可能会更好。

【讨论】:

【参考方案2】:

那里有一些关于不同联接的非常好的文章。但看起来你会对左连接感兴趣。因此,如果它存在于 Target 中,但不存在于 Source 中,则不会删除记录。

所以,应该是:

SELECT(...) Target
LEFT OUTER JOIN
SELECT(...) Source
   ON cond1 and cond2 and cond3 and cond4 and cond5

试一试,告诉我进展如何!

【讨论】:

【参考方案3】:

有时你需要依靠逻辑分析而不是感觉。使用此查询查找不匹配的字段,然后制定后续步骤

SELECT 
Target.Col1,Source.Col1,
Target.Col2,Source.Col2,
Target.Col3,Source.Col3
FROM
(

) Target
FULL OUTER JOIN
(

) Source
ON  Target.Col1=Source.Col1
AND Target.Col2=Source.Col2
AND Target.Col3=Source.Col3
WHERE (
Target.Col1 IS NULL 
OR Source.Col1 IS NULL 
OR Target.Col2 IS NULL 
OR Source.Col2 IS NULL 
OR Target.Col3 IS NULL
OR Source.Col3 IS NULL
)

【讨论】:

以上是关于具有相同计数值的两个表之间的内部联接的主要内容,如果未能解决你的问题,请参考以下文章

优化两个数百万行表之间的内部联接

基于 SQL Server 2008 中列值的内部联接

如何在两个表之间创建正确的联接?

带有内部联接和子查询的 Microsoft Access 更新语句

如何将两个 DataTable 与内部连接连接在一起

Access 中部分列的内部联接