内部联接返回太多行

时间:2016-06-29 21:36:29

标签: sql sql-server join

我在连接两个表时遇到问题,只能从另一个表返回一列。

SELECT om.*, cm.Sales_Stage FROM dbo.OM_Table1 om JOIN dbo.Criteria_Matters cm ON cm.clientCorporationID = om.ClientCorporationID ORDER BY om.ClientCorporationID

我想从我的CM表中包含Sales_Stage,但是连接导致结果集返回14k +行而不是没有连接返回的~7k。

无论如何只是引入这个额外的列而不会破坏查询?

2 个答案:

答案 0 :(得分:1)

您可以使用子查询...请注意,由于每个sales_stage Criteria_Matters中有多个条目,因此可能无法正确选择所需的ClientCorporationID。你可能需要在子查询上订购。

SELECT om.*, 
    (SELECT TOP 1 cm.Sales_Stage 
    FROM dbo.Criteria_Matters cm
    WHERE cm.clientCorporationID = om.ClientCorporationID)  AS Sales_Stage
ORDER BY om.ClientCorporationID

...我假设om.*仅用于示例。通常最佳做法是不要在生产中这样做。

如果你打算看到差异,你可能想要做这样的事情......

SELECT om.*, cm.Sales_Stage, cm.Criteria_MatterID
FROM dbo.OM_Table1 om 
JOIN dbo.Criteria_Matters cm ON cm.clientCorporationID = om.ClientCorporationID
ORDER BY om.ClientCorporationID

答案 1 :(得分:0)

只是猜测,因为没有关于表结构的信息,但问题很可能是Criteria_Matters表有给定clientCorporationID的许多记录。因此,它将根据匹配的Criteria_Matters.ClientCorporationID记录的数量复制OM_Table1中的每条记录。

有几种方法可以解决这个问题 - 一种方法是使用内联视图而不是连接到完整的Criteria_Matters表。

如果添加内联视图和GROUP BY Criteria_Matters.ClientCorporationID - 您可以保证在连接表中每个ClientCorporationID只有一条记录 - 并且您不会获得重复记录。当然,由于您按clientCorporationID进行分组,因此需要将一些聚合函数应用于Sales_Stage。如果您只选择MAX(Sales_Stage),您将获得最大值。如果您知道Sales_Stage对于每个给定的clientCorporationID都是相同的 - 您都已设置好。 SQL将类似于以下内容:

SELECT om.*, cm.Sales_Stage 
FROM dbo.OM_Table1 om 
INNER JOIN 
(
    SELECT clientCorporationID, MAX(Sales_Stage) AS Sales_Stage
    FROM dbo.Criteria_Matters
    GROUP BY clientCorporationID 
) cm ON cm.clientCorporationID = om.ClientCorporationID
ORDER BY om.ClientCorporationID

但是,如果Criteria_Matters表中的给定clientCorporationID有不同的Sales_Stage值,则可以按clientCorporationID和Sales_Stage进行分组。执行此操作时,您现在将获得重复的OM_Table1记录 - 但仅适用于与Criteria_Matters中的ClientCorporationID相对应的每个唯一Sales_Stage。 SQL看起来像这样:

SELECT om.*, cm.Sales_Stage 
FROM dbo.OM_Table1 om 
INNER JOIN 
(
    SELECT clientCorporationID, Sales_Stage
    FROM dbo.Criteria_Matters
    GROUP BY clientCorporationID, Sales_Stage
) cm ON cm.clientCorporationID = om.ClientCorporationID
ORDER BY om.ClientCorporationID
祝你好运!