0

为什么我会为此获得这么多记录

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

有什么建议吗?

4

1 回答 1

1

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

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

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

因此,再次添加第三个表,而不是记录数,然后仔细查看 A 中的 id 重复的数据。看看您打算返回的列,它们对于 id 是否总是相同的?如果它们不同,那么您就没有一对一的关系,您需要了解这是数据完整性问题,或者您错误地认为存在一对一。如果它们相同,则派生表可能是有序的。您只需要来自 tableb 的 id,因此连接可能如下所示:

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

希望这可以帮助。

于 2012-10-17T15:22:20.603 回答