SQL基本连接错误

SQL基本连接错误,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有两个SQL查询,它们本身可以很好地工作,但当我尝试组合它们时,它们就不能工作了,这很可能是我的一个基本误解。这些是疑问;第三是我尝试将它们结合起来。我错过了什么?我得到了很高的数量,比如:Q1/db1:185q2/db2:180(这没关系,我编写查询是为了找出差异。)Q3:db1:925db2:2340,它分别给出了5和13的乘数 注意:Item_ID和ArticleNo是我的语言的不同版本中的文本字段,因此默认为COLLATE DATABASE_。它们确实包含相同的信息。 在SQL Ser

我有两个SQL查询,它们本身可以很好地工作,但当我尝试组合它们时,它们就不能工作了,这很可能是我的一个基本误解。这些是疑问;第三是我尝试将它们结合起来。我错过了什么?我得到了很高的数量,比如:Q1/db1:185q2/db2:180(这没关系,我编写查询是为了找出差异。)Q3:db1:925db2:2340,它分别给出了5和13的乘数

注意:Item_ID和ArticleNo是我的语言的不同版本中的文本字段,因此默认为COLLATE DATABASE_。它们确实包含相同的信息。 在SQL Server 2008 R2上运行

我对dbo的名字做了一些匿名化

SELECT CONVERT(INT, ROUND(SUM(i.Quantity), 0)) AS CUB,
       i.Item_ID
FROM [dbo].[ITEM_CONFIGS] AS i
LEFT OUTER JOIN [dbo].[LOCATIONS_CONFIGS] AS l ON l.Config_ID = i.Config_ID
LEFT OUTER JOIN [dbo].[ITEMS] AS ii ON i.Item_ID = ii.Item_ID
WHERE i.Quantity > -1
GROUP BY i.Item_ID
ORDER BY i.Item_ID ASC

SELECT SUM(s.UnitInStock) AS UnitInStock,
       s.ArticleNo
FROM [dbo].TotalsView AS s
LEFT OUTER JOIN [dbo].Article AS a ON s.ArticleNo = a.ArticleNo
LEFT OUTER JOIN [dbo].Supplier AS r ON a.MainSupplierNo = r.SupplierNo
WHERE s.ArticleNo IS NOT NULL
    AND s.UnitInStock IS NOT NULL
    AND a.InActiveYesNo = 0
GROUP BY s.ArticleNo
ORDER BY s.ArticleNo ASC

SELECT CONVERT(INT, ROUND(SUM(i.Quantity), 0)) AS CUB,
       SUM(s.UnitInStock) AS UnitInStock,
       s.ArticleNo
FROM [dbo].[ITEM_CONFIGS] AS i
LEFT JOIN [dbo].[LOCATIONS_CONFIGS] AS l ON l.Config_ID = i.Config_ID
LEFT JOIN [dbo].[ITEMS] AS ii ON i.Item_ID = ii.Item_ID
INNER [dbo].StockSurveyTotalsView AS s ON ii.Item_ID COLLATE database_default =
    s.ArticleNo COLLATE database_default
INNER JOIN [dbo].Article AS a ON s.ArticleNo = a.ArticleNo
WHERE s.ArticleNo IS NOT NULL
    AND s.UnitInStock IS NOT NULL
    AND a.InActiveYesNo = 0
    AND ii.Item_ID IS NOT NULL
GROUP BY s.ArticleNo
ORDER BY s.ArticleNo ASC

使用与CTE相同的前2个查询,并将它们连接起来以获得结果

;WITH CUB AS (
SELECT CONVERT(INT, ROUND(SUM(i.Quantity), 0)) AS CUB,
       i.Item_ID
FROM [dbo].[ITEM_CONFIGS] AS i
LEFT OUTER JOIN [dbo].[LOCATIONS_CONFIGS] AS l ON l.Config_ID = i.Config_ID
LEFT OUTER JOIN [dbo].[ITEMS] AS ii ON i.Item_ID = ii.Item_ID
WHERE i.Quantity > -1
GROUP BY i.Item_ID
),
UnitInStock AS (
SELECT SUM(s.UnitInStock) AS UnitInStock,
       s.ArticleNo
FROM [dbo].TotalsView AS s
LEFT OUTER JOIN [dbo].Article AS a ON s.ArticleNo = a.ArticleNo
LEFT OUTER JOIN [dbo].Supplier AS r ON a.MainSupplierNo = r.SupplierNo
WHERE s.ArticleNo IS NOT NULL
    AND s.UnitInStock IS NOT NULL
    AND a.InActiveYesNo = 0
GROUP BY s.ArticleNo
)
SELECT c.CUB, uis.UnitInStock, uis.ArticleNo FROM CUB AS c
INNER JOIN UnitInStock AS uis ON c.Item_Id COLLATE database_default = uis.ArticleNo COLLATE database_default 
ORDER BY uis.ArticleNo;

使用与CTE相同的前2个查询,并将它们连接起来以获得结果

;WITH CUB AS (
SELECT CONVERT(INT, ROUND(SUM(i.Quantity), 0)) AS CUB,
       i.Item_ID
FROM [dbo].[ITEM_CONFIGS] AS i
LEFT OUTER JOIN [dbo].[LOCATIONS_CONFIGS] AS l ON l.Config_ID = i.Config_ID
LEFT OUTER JOIN [dbo].[ITEMS] AS ii ON i.Item_ID = ii.Item_ID
WHERE i.Quantity > -1
GROUP BY i.Item_ID
),
UnitInStock AS (
SELECT SUM(s.UnitInStock) AS UnitInStock,
       s.ArticleNo
FROM [dbo].TotalsView AS s
LEFT OUTER JOIN [dbo].Article AS a ON s.ArticleNo = a.ArticleNo
LEFT OUTER JOIN [dbo].Supplier AS r ON a.MainSupplierNo = r.SupplierNo
WHERE s.ArticleNo IS NOT NULL
    AND s.UnitInStock IS NOT NULL
    AND a.InActiveYesNo = 0
GROUP BY s.ArticleNo
)
SELECT c.CUB, uis.UnitInStock, uis.ArticleNo FROM CUB AS c
INNER JOIN UnitInStock AS uis ON c.Item_Id COLLATE database_default = uis.ArticleNo COLLATE database_default 
ORDER BY uis.ArticleNo;

在第三个查询中,您忘记实现第一个查询中的
GROUPBY i.Item_ID
行。我会使用张鹏的CTE,因为它们更容易阅读/理解,但这就是为什么他的CTE应该有效而你的CTE可能无效的原因。

在第三次查询中,你忘记了实现第一次查询中的
GROUP BY I.Item_ID
行。我会使用张鹏的CTE,因为它们更容易阅读/理解,但这就是为什么他的CTE应该有效而你的CTE可能无效的原因。

所有表格的样本数据和预期结果将帮助我们更好地理解
内部[dbo].StockSurveyTotalsView as s…
JOIN
关键字丢失当您在新的
JOIN
后获得高结果时,这表明您的一个(或多个)表已导致
1:many
关系。发现哪个表导致结果膨胀的一种快速方法是删除
分组依据
,然后执行
选择*
,同时保持
相同。您可以分析单个记录,以找到要复制的记录,然后查看哪个表带来了多个结果。为了提供帮助,正如@motoGP所建议的,您应该发布一些示例数据和预期结果。您删除了
左侧外部联接[dbo]。在第二个查询中的a.MainSupplierNo=r.SupplierNo
行中的供应商as r,但没有删除第三个查询。我意识到你删除了它,因为在第二次查询中从未使用过
r
。当您对这些查询进行匿名化时,您是否对它们进行了一些更改,或者它实际上只是一个未使用的行?所有表的样本数据和预期结果将帮助我们更好地理解这里的
internal[dbo].StockSurveyTotalsView as s…
JOIN
关键字丢失当您在新的
JOIN
后获得高结果时,这表明您的一个(或多个)表已导致
1:many
关系。发现哪个表导致结果膨胀的一种快速方法是删除
分组依据
,然后执行
选择*
,同时保持
相同。您可以分析单个记录,以找到要复制的记录,然后查看哪个表带来了多个结果。为了提供帮助,正如@motoGP所建议的,您应该发布一些示例数据和预期结果。您删除了
左侧外部联接[dbo]。在第二个查询中的a.MainSupplierNo=r.SupplierNo
行中的供应商as r,但没有删除第三个查询。我意识到你删除了它,因为在第二次查询中从未使用过
r
。当你将这些查询匿名化时,你是否对它们做了一点修改,或者它只是一个未使用的行?谢谢大家的意见。我使用了张的答案,并设法让它与适当的dbo名称一起工作。此外,我已决定将WITH的作为视图实施,并将其用于张的回答中的选择部分。感谢大家的投入。我已经使用了@Zhang Peng的答案,并设法使其与适当的dbo名称一起工作。此外,我决定将WITH的作为视图来实现,并将其用于张的答案中的选择部分。对一些评论的回应:我会记得在将来提供更多的信息,并作为我以外的人校对这个问题。jnevil感谢您提供的调试提示。Zach Mierzejewski缺少连接是由anon C^-X造成的输入错误。第三季度的SELECT中没有项目ID,所以我想我答对了。谢谢大家的输入。我使用了张的答案,并设法让它与适当的dbo名称一起工作。此外,我已决定将WITH的作为视图实施,并将其用于张的回答中的选择部分。感谢大家的投入。我已经使用了@Zhang Peng的答案,并设法使其与适当的dbo名称一起工作。此外,我决定将WITH的作为视图来实现,并将其用于张的答案中的选择部分。对一些评论的回应:我会记得在将来提供更多的信息,并作为我以外的人校对这个问题。jnevil感谢您提供的调试提示。Zach Mierzejewski缺少的连接是由anon C^-X造成的输入错误。第三季度的SELECT中没有项目ID,所以我想我是对的。