【问题标题】:CTE For a Complex Query复杂查询的 CTE
【发布时间】:2016-11-07 18:22:00
【问题描述】:

我有这个问题:

SELECT C.[First Name],
C.[Last Name],
SUM(Salary.Emp_Salary) AS 'Current Salary'

    FROM
    (
    SELECT
        Emp_First_Name AS "First Name",
        Emp_Last_Name AS "Last Name",

        MAX(Emp_Salary_Change_Year) AS "Change Year"
        FROM Employee_Details AS e

    INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id
    INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id
    INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id
    INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id
    WHERE Emp_Active = 1
    GROUP BY Emp_First_Name, Emp_Last_Name,
    Emp_Middle_Name, Country_Name, Desig_Name) AS C
    INNER JOIN Salary ON C.[Change Year] = Salary.Emp_Salary_Change_Year
group by C.[First Name],
C.[Last Name];

返回:

 First Name Last Name Current Salary
Chen    Chen    76000.00
Sahi    King    156000.00
Venessa Katarina    185000.00

如何使用 CTE 进行此查询? 我知道使用 WITH 子句,但我无法让它工作,因为查询很复杂。我用这个作为参考:http://www.codeproject.com/Articles/265371/Common-Table-Expressions-CTE-in-SQL-SERVER 但它只包含简单的示例。

谢谢。

【问题讨论】:

  • 您的查询是否提供了您想要的结果?
  • 解决了。我必须在整个 cte 之后添加一个 SELECT * FROM T 子句
  • 非常好。你能把你的结果显示为答案吗?

标签: sql sql-server tsql common-table-expression


【解决方案1】:

很简单;忽略了语法。

 WITH T([First Name], [Last Name], [Current Salary])
AS
 (

SELECT C.[First Name],
C.[Last Name],

SUM(Salary.Emp_Salary) AS 'Current Salary'

    FROM
    (
    SELECT
        Emp_First_Name AS "First Name",
        Emp_Last_Name AS "Last Name",

        MAX(Emp_Salary_Change_Year) AS "Change Year"
        FROM Employee_Details AS e

    INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id
    INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id
    INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id
    INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id
    WHERE Emp_Active = 1
    GROUP BY Emp_First_Name, Emp_Last_Name,
    Emp_Middle_Name, Country_Name, Desig_Name) AS C
    INNER JOIN Salary ON C.[Change Year] = Salary.Emp_Salary_Change_Year
group by C.[First Name],
C.[Last Name]
)
SELECT * FROM T;

【讨论】:

    【解决方案2】:

    这取决于你想在哪里休息。通常可以将内联视图创建为 CTE,以使查询更易于阅读...在这种情况下,我删除了您的行视图并将其设为 CTE。

    With C as (
        (
        SELECT
            Emp_First_Name AS "First Name",
            Emp_Last_Name AS "Last Name",
    
            MAX(Emp_Salary_Change_Year) AS "Change Year"
            FROM Employee_Details AS e
    
        INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id
        INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id
        INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id
        INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id
        WHERE Emp_Active = 1
        GROUP BY Emp_First_Name, Emp_Last_Name,
        Emp_Middle_Name, Country_Name, Desig_Name)
    
    SELECT C.[First Name]
         , C.[Last Name],
         SUM(Salary.Emp_Salary) AS 'Current Salary'
    FROM C
    INNER JOIN Salary 
      ON C.[Change Year] = Salary.Emp_Salary_Change_Year
    GROUP BY  C.[First Name]
             ,C.[Last Name];
    

    【讨论】:

      【解决方案3】:

      这取决于你想在哪里休息。通常可以将内联视图创建为 CTE,以使查询更易于阅读...在这种情况下,我删除了您的行视图并将其设为 CTE。

      With C as (
          (
          SELECT
              Emp_First_Name AS "First Name",
              Emp_Last_Name AS "Last Name",
      
              MAX(Emp_Salary_Change_Year) AS "Change Year"
              FROM Employee_Details AS e
      
          INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id
          INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id
          INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id
          INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id
          WHERE Emp_Active = 1
          GROUP BY Emp_First_Name, Emp_Last_Name,
          Emp_Middle_Name, Country_Name, Desig_Name)
      
      SELECT C.[First Name]
           , C.[Last Name],
           SUM(Salary.Emp_Salary) AS 'Current Salary'
      FROM C
      INNER JOIN Salary 
        ON C.[Change Year] = Salary.Emp_Salary_Change_Year
      GROUP BY  C.[First Name]
               ,C.[Last Name];
      

      或者你可以在 ctes 上构建...

      With C as (
          (
          SELECT
              Emp_First_Name AS "First Name",
              Emp_Last_Name AS "Last Name",
      
              MAX(Emp_Salary_Change_Year) AS "Change Year"
              FROM Employee_Details AS e
      
          INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id
          INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id
          INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id
          INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id
          WHERE Emp_Active = 1
          GROUP BY Emp_First_Name, Emp_Last_Name,
          Emp_Middle_Name, Country_Name, Desig_Name),
      CTE2 as (    
          SELECT C.[First Name]
               , C.[Last Name],
               SUM(Salary.Emp_Salary) AS 'Current Salary'
          FROM C
          INNER JOIN Salary 
            ON C.[Change Year] = Salary.Emp_Salary_Change_Year
          GROUP BY  C.[First Name]
                   ,C.[Last Name])
      SELECT * 
      FROM CTE2;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 2012-07-13
        • 2012-04-02
        • 2013-05-22
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多