使用 Count() 和窗口函数的 sql 内部连接

Posted

技术标签:

【中文标题】使用 Count() 和窗口函数的 sql 内部连接【英文标题】:sql inner Join with Count() and windowing functions 【发布时间】:2012-08-26 12:49:21 【问题描述】:
;WITH n AS  
( 
  SELECT problemID, StationName, problemCode, ProblemCreateDate, probCount, 
    c = COUNT(*) OVER (PARTITION BY StationName, problemCode), 
    rn = ROW_NUMBER() OVER  
    ( 
      PARTITION BY StationName, problemCode ORDER BY ProblemCreateDate DESC, problemID DESC 
    ) 
  FROM dbo.tblProblems
) 
 SELECT problemID, StationName, problemCode, ProblemCreateDate, c 
 FROM n WHERE rn = 1; 

还有一个名为 tblCustomers 的表,其中有一列 isAssistent Type(bit)

我尝试进行内部连接,但它对我来说太复杂了,并且在尝试使用 inner join 的过滤器时出现错误

tblCustomers where tblCustomers.isAssistent =1

我将非常感激并很高兴知道如何编写正确的语法

重新编辑

inner join tblCustomers on tblProblems.CustID = tblCustomers.custID

错误,我最后一次尝试

Msg 4104, Level 16, State 1, Line 14 多部分标识符 无法绑定“tblProblems.CustID”。消息 4104,级别 16,状态 1, 第 12 行 多部分标识符“tblproblems.problemID”不能 边界。 Msg 4104, Level 16, State 1, Line 12 多部分标识符 无法绑定“tblproblems.custID”。消息 4104,级别 16,状态 1, 第 12 行 多部分标识符“tblproblems.StationName”不能 约束。 Msg 4104, Level 16, State 1, Line 12 多部分 无法绑定标识符“tblproblems.problemCode”。消息 4104, Level 16, State 1, Line 12 多部分标识符 无法绑定“tblproblems.ProblemCreateDate”。

这是我的疯狂猜测:

;WITH n AS  
( 
  SELECT tblCustomers.*,tblproblems.problemID, tblproblems.StationName, tblproblems.problemCode, tblproblems.ProblemCreateDate, tblproblems.probCount, 
    c = COUNT(*) OVER (PARTITION BY tblproblems.StationName, tblproblems.problemCode), 
    rn = ROW_NUMBER() OVER  
    ( 
      PARTITION BY tblproblems.StationName, tblproblems.problemCode ORDER BY tblproblems.ProblemCreateDate DESC, tblproblems.problemID DESC 
    ) 
  FROM dbo.tblProblems
  inner join tblCustomers on tblProblems.CustID = tblCustomers.custID
) 
SELECT tblCustomers.*, tblproblems.problemID, tblproblems.custID, tblproblems.StationName, tblproblems.problemCode, tblproblems.ProblemCreateDate, c 
FROM n 
inner join tblCustomers on tblProblems.CustID = tblCustomers.custID
WHERE rn = 1; 

目的是仅在 tblCustomers.isAssistent=1 时才获得 tblProblems 的选择结果

【问题讨论】:

你能发布抛出的错误吗? 用pk信息转发帖子 外部SELECT 引用别名tblProblems,但应该引用n。它也将从tblCustomers 返回数据,但不是您期望的方式,因为它在外部SELECT 中是JOINed。 【参考方案1】:

你在外面的查询是错误的,应该是

SELECT tblCustomers.*, n.problemID, n.custID, 
           n.StationName, n.problemCode, n.ProblemCreateDate, c 
FROM n 
inner join tblCustomers on n.CustID = tblCustomers.custID
WHERE rn = 1; 

那你为什么又要加入 tblcustomers 呢?

你可以这样做:

;WITH n AS  

( 
  SELECT tblCustomers.*,tblproblems.problemID, tblproblems.StationName, 
         tblproblems.problemCode, tblproblems.ProblemCreateDate,
         tblproblems.probCount, 
    c = COUNT(*) OVER 
        (PARTITION BY tblproblems.StationName, tblproblems.problemCode), 
    rn = ROW_NUMBER() OVER  
    ( 
      PARTITION BY tblproblems.StationName, tblproblems.problemCode
      ORDER BY tblproblems.ProblemCreateDate DESC, tblproblems.problemID DESC 
    ) 
  FROM dbo.tblProblems
  inner join tblCustomers on tblProblems.CustID = tblCustomers.custID
  WHERE tblCustomers.isAssistent =1

) 
SELECT n.* FROM n where rn = 1

如果你只需要问题数据

;WITH n AS  

( 
  SELECT tblproblems.problemID, tblproblems.StationName, 
         tblproblems.problemCode, tblproblems.ProblemCreateDate,
         tblproblems.probCount, 
    c = COUNT(*) OVER 
        (PARTITION BY tblproblems.StationName, tblproblems.problemCode), 
    rn = ROW_NUMBER() OVER  
    ( 
      PARTITION BY tblproblems.StationName, tblproblems.problemCode
      ORDER BY tblproblems.ProblemCreateDate DESC, tblproblems.problemID DESC 
    ) 
  FROM dbo.tblProblems
  inner join tblCustomers on tblProblems.CustID = tblCustomers.custID
  WHERE tblCustomers.isAssistent =1

) 
SELECT n.* FROM n where rn = 1

【讨论】:

现在很好,没有错误,但查询与没有内部连接的原始查询不同,我需要问题列,但现在它绘制了 tblCustomesrs 字段 insted Of tblProblems 实际上我现在看到它也存在 tblProblems.*(抱歉 tblCustomers 有 30 多个列)但我不会在 Gridview 选择命令中调用它们 我需要的只是改变 rs。回答 custid 而不是 * 非常感谢你是谁,你在哪里......你在我的语言中是大炮!

以上是关于使用 Count() 和窗口函数的 sql 内部连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中使用带有框架的窗口函数执行 COUNT(DISTINCT)

SQL窗口函数和连接

SQL - 使用窗口函数创建滞后变量

结合实例来分析SQL的窗口函数

窗口函数--排序函数

带窗口函数的高级 SQL