SQL使用动态WHERE计算多个连接

时间:2010-11-30 19:25:31

标签: sql sql-server sql-server-2005

我的问题是我有一个Select语句,它有一个动态生成的where子句。它共有5个表格。

我基本上需要表1中每个DISTINCT实例的Count,它属于WHERE的范围。这必须能够在一个陈述中执行。所以,从本质上讲,我不能做全局GROUP BY,因为我需要返回其他4个表数据。

如果我能得到一个具有重复计数的列,那么主键列就是完美的。现在这就是我正在查看的问题:

SELECT  * 
FROM    TBL1 1  
        INNER JOIN TBL2 2 On 2.FK = 1.FK
        INNER JOIN TBL3 3 On 3.PK = 2.PK INNER JOIN TBL4 4 On 4.PK = 3.PK 
        LEFT OUTER JOIN TBL5 5 ON 4.PK = 5.PK 
WHERE   1.Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00'
ORDER BY 
        4.Column
        , 3.Column
        , 3.Column2
        , 1.Date_Time_In DESC

因此,我不会选择所有列,而是将其过滤到大约5或6但是我需要类似于Total列的内容,这是TBL1的主键的不同计数,它应用了WHERE子句,该子句有可能规模越来越大,越来越小。

我几乎希望有一种方法可以将相同的WHERE子句应用于子选择,因为我意识到它可以工作,但不知道除了创建变量之外的其他方法,只是将它放在我不能的两个地方做任何一个。

2 个答案:

答案 0 :(得分:1)

如果您使用的是SQL Server 2005或更高版本,则可以使用AGGREGATE OVER函数之一。

SELECT  *
        , COUNT(UserID) OVER(PARTITION BY UserID) AS 'Total'
FROM    TBL1 1  
        INNER JOIN TBL2 2 On 2.FK = 1.FK
        INNER JOIN TBL3 3 On 3.PK = 2.PK INNER JOIN TBL4 4 On 4.PK = 3.PK 
        LEFT OUTER JOIN TBL5 5 ON 4.PK = 5.PK 
WHERE   1.Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00'
ORDER BY 
        4.Column, 3.Column, 3.Column2, 1.Date_Time_In DESC

答案 1 :(得分:0)

类似于添加:

inner join (select pk, count(distinct user_id) from tbl1 WHERE Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00') as tbl1too on 1.PK = tbl1too.PK