代码之家  ›  专栏  ›  技术社区  ›  MPJ567

联接结果与预期不匹配

  •  0
  • MPJ567  · 技术社区  · 8 年前

    我觉得问这个很可笑,但我已经盯着我的代码看了这么久,我看不出我遗漏了什么明显的答案:

    declare @OrderFrequency table (CustomerID int, OrderYear int, OrderFrequency int)
    
    ;with OrderFrequency as
    (
    
    Select
          CustomerID,
          datepart(month, OrderDate) OrderMonth,
          datepart(year, OrderDate) OrderYear,
          cast(datepart(month, OrderDate) as nvarchar) +'/'+cast(datepart(year, OrderDate) as nvarchar) MonthYearCode
    from Sales.SalesOrderHeader
    group by CustomerID, datepart(month, OrderDate), datepart(year, OrderDate)
    
    )
    insert into @OrderFrequency
    Select CustomerID, OrderYear, count(distinct MonthYearCode) OrderFrequency
    from OrderFrequency
    group by CustomerID, OrderYear
    order by CustomerID, OrderYear
    
    
    declare @CTETable table (CustomerID int, OrderTotal float, OrderMonth int, OrderYear int)
    ;with CTE as
    (
    Select
          CustomerID,
          sum(TotalDue) OrderTotal,
          datepart(month, OrderDate) OrderMonth,
          datepart(year, OrderDate) OrderYear
    from Sales.SalesOrderHeader
    group by CustomerID, datepart(month, OrderDate), datepart(year, OrderDate)
    
    )
    insert into @CTETable
    select * from CTE
    
    Select CTET.*
    from @CTETable CTET
    left outer join @OrderFrequency Ord on Ord.CustomerID = CTET.CustomerID
    order by CTET.CustomerID, CTET.OrderYear
    

    我的最后一个select语句将从CTET返回all,并从@OrderFrequency上的join返回额外的行。

    我的CTET规格*是否只返回CTET?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Leia    8 年前

    如果Ord可以为每个CustomerID有多行,那么您将从join中获得比CTET更多的行。这是您的行集,无论您决定如何显示哪些列。无论您选择CTET.*还是Ord.*,您的行数都将保持不变。