使用where子句会导致无效的列名错误

mHe*_*pMe 1 sql sql-server sql-server-2012

我正在使用SQL Server 2012.

我写了下面的查询,除了我包含最后一行'NomDiff <> 0'时,它的工作正常.

它告诉我NomDiff是一个无效的列名.我不明白为什么,也不知道如何让查询只返回nomDiff不等于零的行?

;with pf as
(
    select Name, Sedol, Nominal from tblTempPLF 
    where FundCode = 'CSGE'
), pc as
(
    select Name, Sedol, Nominal from tblTempPCF 
    where FundCode = 'BTCM'
)
select coalesce(pf.Name, pc.Name) Name, coalesce(pf.Sedol, pc.Sedol) Sedol, 
isnull(pf.Nominal,0) PfNom, isnull(pc.Nominal,0) PcNom, isnull(pf.Nominal,0) - isnull(pc.Nominal,0) NomDiff
from pf full outer join pc on pf.Sedol = pc.Sedol
where NomDiff <> 0 
Run Code Online (Sandbox Code Playgroud)

Mar*_*son 5

使用APPLY VALUES是一种不必使用子查询或其他CTE的好方法:

WITH    pf
AS ( SELECT
      Name ,
      Sedol ,
      Nominal
      FROM tblTempPLF
      WHERE FundCode = 'CSGE'
    ),
pc
AS ( SELECT
      Name ,
      Sedol ,
      Nominal
      FROM tblTempPCF
      WHERE FundCode = 'BTCM'
    )
  SELECT
      Name = COALESCE(pf.Name, pc.Name),
      Sedol = COALESCE(pf.Sedol, pc.Sedol),
      PfNom = ISNULL(pf.Nominal, 0),
      PcNom = ISNULL(pc.Nominal, 0),
      NomDiff = Nom.Diff
  FROM pf
  FULL OUTER JOIN pc
  ON  pf.Sedol = pc.Sedol
  CROSS APPLY(VALUES(ISNULL(pf.Nominal, 0) - ISNULL(pc.Nominal, 0))) AS Nom(Diff)
  WHERE Nom.Diff <> 0;
Run Code Online (Sandbox Code Playgroud)