加入TableA,TableB和TableC以从TableA和TableC获取数据

时间:2012-10-17 14:52:01

标签: sql-server-2008

为什么我收到这么多的记录

SELECT e.OneColumn, fb.OtherColumn
FROM  dbo.TABLEA FB
INNER JOIN dbo.TABLEB eo ON Fb.Primary = eo.foregin
INNER JOIN dbo.TABLEC e ON eo.Primary =e.Foreign
WHERE FB.SomeOtherColumn = 0

当我运行这个时,我收到的数百万条记录不是正确的情况,所有表的记录数都较少。

我需要从TableA和TableC获取列,因为它们没有逻辑连接所以我必须使用TableB作为桥接

修改

以下是计数:

TABLEA = 273551
TABLEB = 384412
TABKEC = 13046

以上查询= 2分钟后我强行取消了查询..直到那个时候计数 11437613

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

为了弄清楚在这样的查询中发生了什么,结果不是预期的,我倾向于这样做。首先我改为SELECT *(注意这只是为了解决问题,不要在生产中使用SELECT *!)如果查询中没有一个,我会从tableA为ID frield添加一个order by。

所以现在我将查询运行到第一个表,包括来自第一个表的任何条件。我评论其余的。我注意到返回的记录数。

现在我添加第二个表以及其中的任何条件。如果我期待一个关系,如果这个查询没有返回多少记录,那么我查看正在返回的数据,看看我是否能找出原因。由于内容是按table1 ID排序的,因此您可以通常看到一些相当容易重复的记录示例,然后滚动直到找到导致差异的字段。通常这意味着您需要某种addtional where子句或聚合在下一个表中的字段,以限制只有一个记录。 JUSt此时记下了问题,因为您可以在下一次加入时更有效地进行更改。

因此,再次添加第三个表,而不是记录数,然后仔细查看重复来自A的id的数据。在你打算返回的栏目中,他们总是和同一个人一样吗?如果它们不同,那么你就没有一对一的关系,你需要明白,这是一个数据完整性问题,或者你错误地认为存在一对一的关系。如果tehy是相同的,那么派生表可能是有序的。你只需要来自tableb的id,所以连接看起来像这样:

JOIN (SELECT MIn(Primary), foreign FROM TABLEB GROUP BY foreign) EO ON Fb.Primary = eo.foreign  

希望这有帮助。