小编nor*_*tos的帖子

在 SQL Server 中使用临时表比派生表有优势吗?

我读到派生表比临时表具有更好的性能,但无论如何许多 SQL Server 开发人员更喜欢第二个。为什么?我必须对大数据(数百万条记录)进行查询,并且我想确保我使用的是最佳选择。

CREATE TABLE A(
    id BIGINT IDENTITY(1,1) NOT NULL,
    field1 INT NOT NULL,
    field2 VARCHAR(50) NULL,
);

CREATE TABLE B(
    id INT IDENTITY(1,1) NOT NULL,
    field1 VARCHAR(10) NULL,
    field2 INT NULL
);

INSERT INTO A 
    (field1,field2)
VALUES 
    (1,'a'),(2,'b'),(3,'c'),(2,'d'),(5,'e'),
    (6,'f'),(7,'g'),(8,'h'),(9,'i'),(2,'j');

INSERT INTO B 
    (field1,field2)
VALUES 
    ('a',1),('b',2),('c',3),('d',4),('e',5),
    ('f',6),('g',7),('h',8),('i',9),('j',2),('k',3);

DECLARE @begin INT=0,@end INT=200;
Run Code Online (Sandbox Code Playgroud)

派生表

/*derived tables*/
SELECT 
    C.id,C.field1,C.field2,C.field3 
FROM
(
    SELECT
        A.id,A.field1,A.field2,B.field2 AS field3, 
        ROW_NUMBER() OVER (ORDER BY A.id) AS iRow
    FROM 
        A INNER JOIN B ON A.field1=B.id
) C …
Run Code Online (Sandbox Code Playgroud)

performance sql-server-2008 sql-server derived-tables temporary-tables query-performance

8
推荐指数
2
解决办法
2万
查看次数

按列中的日期范围分组

我有一个数据表:

ID    Action    Date
1     Action1   2014-01-20
2     Action1   2014-01-22
3     Action1   2014-01-28
4     Action2   2014-01-20
5     Action2   2014-01-22
6     Action2   2014-01-28
Run Code Online (Sandbox Code Playgroud)

我需要按日期分组,以 3 天的差异分组:

Action       Count
Action1      2
Action2      2
Run Code Online (Sandbox Code Playgroud)

如果一条记录与以前的记录分组,则它不会在另一个组中:

ID    Action    Date
1     Action1   2014-01-20
2     Action1   2014-01-23
3     Action1   2014-01-24

Action       Count
Action1      2
Run Code Online (Sandbox Code Playgroud)

我的解决方案:

SELECT T1.Action, DATEDIFF(DAY,T1.Date,T2.Date) as Count
FROM Table T1
JOIN Table T2 ON T1.Action=T2.Action
WHERE DATEDIFF(DAY,T1.Date,T2.Date) BETWEEN 1 AND 3
GROUP BY T1.Action,T1.Date,T2.Date
Run Code Online (Sandbox Code Playgroud)

这是正确的解决方案吗?

sql-server sql-server-2008-r2

5
推荐指数
1
解决办法
2万
查看次数