比较2个表并在一个表中显示另一个表中找不到的行

时间:2014-07-10 18:48:54

标签: sql sql-server left-join

我想在表格n4ac中找不到[stac]。[Key] + SUM([stac]。[Gross Sls Qty]的值。这就是我所拥有的:

SELECT [stac].[Key] + SUM([stac].[Gross Sls Qty]) 
FROM @SoldToActuals stac
     LEFT JOIN @Node4Actuals n4ac 
          ON (([stac].[Key] + SUM([stac].[Gross Sls Qty])) = ([n4ac].[Key] + SUM([n4ac].[Gross Sls Qty])))
WHERE [stac].[Key] + SUM([stac].[Gross Sls Qty]) IS NULL

我收到此错误:

  

聚合不能出现在ON子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。

有什么建议吗?

感谢。

4 个答案:

答案 0 :(得分:0)

我的建议是在MSDN上为TSQL查找WHERE NOT IN,然后使用NOT运算符将其反转

这是一个链接:IN Operator 这是另一个链接:NOT Operator

最后一个简单的通用示例:

SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
    ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant');

这将选择“设计工程师”,“工具设计师”或“营销助理”的每个人,只需添加WHERE e.JobTitle NOT IN即可获得没有其中一个职称的所有人

编辑:

这是我尝试理解您的表结构并尝试从您发布的代码中编写相关示例:

SELECT [stac].[Key] + SUM([stac].[Gross Sls Qty]) 
FROM @SoldToActuals stac
WHERE ([stac].[Key] + SUM([stac].[Gross Sls Qty]))
NOT IN
(SELECT ([n4ac].[Key] + SUM([n4ac].[Gross Sls Qty]) FROM n4ac)

答案 1 :(得分:0)

可能尝试修改您的查询有点像

SELECT [stac].[Key] + SUM([stac].[Gross Sls Qty]) as some_col
FROM @SoldToActuals stac
     LEFT JOIN @Node4Actuals n4ac 
          ON [stac].[Key]  = [n4ac].[Key]
WHERE [n4ac].[Key] IS NULL
OR SUM([stac].[Gross Sls Qty]) > 0

答案 2 :(得分:0)

也许,您可以使用EXCEPT运算符来执行您想要的操作吗? (来自AdventureWorks的示例)

-- Create Some Sample Data -- 

select top 150
    SalesOrderID
   ,LineTotal
into #BigList 
from
    Sales.SalesOrderDetail
order by
    SalesOrderID

select top 15
    SalesOrderID
   ,LineTotal
into #SmallList 
from
    Sales.SalesOrderDetail
order by
    SalesOrderID

-- use except set math operater to find differences -- 

select 
    SalesOrderID
   ,sum(LineTotal) as SumTotal
from
    #BigList 
group by
    SalesOrderID

except 

select 
    SalesOrderID
   ,sum(LineTotal) as SumTotal
from
    #SmallList 
group by
    SalesOrderID

答案 3 :(得分:0)

所以这是尝试重写您的查询,这可能让您看到(更容易一些)如何得到答案。

SELECT  [stac].*
   FROM    ( SELECT    [Key] + SUM([Gross Sls Qty]) AS X
      FROM      @SoldToActuals
    ) AS stac
    LEFT OUTER JOIN ( SELECT    [Key] + SUM([Gross Sls Qty]) AS X
                      FROM      @Node4Actuals
                    ) AS [n4ac] ON n4ac.X = stac.X
   WHERE   [stac].[Key] + SUM([stac].[Gross Sls Qty]) IS NULL

以下是使用“EXCEPT”运算符编写它的首选方法,它就像“UNION MINUS”

SELECT    [Key] + SUM([Gross Sls Qty])
      FROM      @SoldToActuals
EXCEPT 
SELECT    [Key] + SUM([Gross Sls Qty])
      FROM      @Node4Actuals

以下是EXCEPT

的链接