Home > Idola > New in SQL Server 2005 for Developers (Part 1)

New in SQL Server 2005 for Developers (Part 1)

May be I’m writing this very late, but will be useful for someone who is looking for features that are introduced in 2005. The content may not be properly formatted as it was prepared in a hurry.

Common Table Expression

A common table expression (CTE) can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement. A CTE is similar to a derived table in that it is not stored as an object and lasts only for the duration of the query. Unlike a derived table, a CTE can be self-referencing and can be referenced multiple times in the same query.

A CTE can be used to:

  • Create a recursive query. For more information, see Recursive Queries Using Common Table Expressions.
  • Substitute for a view when the general use of a view is not required; that is, you do not have to store the definition in metadata.
  • Enable grouping by a column that is derived from a scalar subselect, or a function that is either not deterministic or has external access.
  • Reference the resulting table multiple times in the same statement.

Using a CTE offers the advantages of improved readability and ease in maintenance of complex queries. The query can be divided into separate, simple, logical building blocks. These simple blocks can then be used to build more complex, interim CTEs until the final result set is generated.

Sample (Northwind database):

WITH TopCustomers (City, Cnt)

AS

(

      SELECT City, count(*) FROM customers

      GROUP BY City

      HAVING count(*) > 1

)

SELECT * FROM

      Customers C inner join TopCustomers on C.City = TopCustomers.City

 

TOP function

SQL2005 allows TOP within the sub query also:

— Simple TOP query

SELECT TOP(5) *

FROM Employees;

— Nested TOP query

SELECT *

FROM (SELECT TOP(5) *

      FROM Employees

      ORDER BY [EmployeeId])

AS E

Order by EmployeeId Desc

Pivot Table

Another feature in 2005 is the Pivot table:

 

SELECT ProductId, Sum(Quantity*UnitPrice)

FROM [Order Details]

GROUP BY ProductId;

 clip_image0011

 

The same query as a Pivot table:

WITH Sales(ProductId, SalesAmt)

AS

      (SELECT ProductId, Quantity*UnitPrice

            FROM [Order Details])

SELECT ‘Sales’ AS SalesByProduct, [23], [46], [69], [15], [3]

FROM

      (SELECT ProductId, SalesAmt FROM Sales) AS SourceTable

PIVOT

      (

      SUM(SalesAmt)

      FOR ProductId IN ([23], [46], [69], [15], [3])

      ) AS PivotTable;

 clip_image002

 

Though this doesn’t look very flexible, there will be instances where this can be applicable.

 

 

Categories: Idola Tags:
  1. No comments yet.