具有相同计数值的两个表之间的内部联接
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
)
【讨论】:
以上是关于具有相同计数值的两个表之间的内部联接的主要内容,如果未能解决你的问题,请参考以下文章