【问题标题】:How should I write this SQL query?我应该如何编写这个 SQL 查询?
【发布时间】:2014-06-26 05:14:24
【问题描述】:

我有一个这样的查询:

SELECT SUM(tab1.amount) amount
FROM tab1
JOIN tab2
  ON tab1.lp_id = tab2.id
JOIN tab3
  ON tab3.employee_id = tab2.employee_id
WHERE tab1.officeid =123
  AND tab3.space <> 2

这很好用。 现在我想为它添加更多过滤器。基本上我有一个表tab4,其中有列employee_id、effective_date、salary。即对于每个员工,我们维护工资更改的日期(即每个员工的多个记录)。我只想选择那些最近薪水大于10000的员工。我该怎么写? 基本上我想要这样的东西:

SELECT SUM(tab1.amount) amount
FROM tab1
JOIN tab2
   ON tab1.lp_id = tab2.id
JOIN tab3
   ON tab3.employee_id            = tab2.employee_id
WHERE tab1.officeid     =123
   AND tab3.space <> 2
   AND (
        select salary 
        from (
              select * 
              from tab4 
              where  tab4.employee_id  = tab2.employee_id
              order by effective_d desc
              )  
        where rownum = 1
        ) > 10000

我正在尝试添加最后两行 - 但由于无法使用 tab2.employee_id 而出现错误。

我该怎么写?

【问题讨论】:

    标签: sql


    【解决方案1】:

    怎么样

    SELECT      t.employee_id, t.salary
    FROM        tab4 t
    INNER JOIN  (SELECT     employee_id, MAX(effective_date) as eff_date
                FROM        tab4
                GROUP BY    employee_id) x
                ON t.employee_id = x.employee_id AND t.effective_date = x.eff_date
    WHERE       t.salary > 10000
    

    这将使您成为薪水大于 10000 的员工

    【讨论】:

      【解决方案2】:

      您是否尝试过使用INTERSECT 运算符?

      SELECT SUM(tab1.amount) amount
      FROM tab1
      JOIN tab2
         ON tab1.lp_id = tab2.id
      JOIN tab3
         ON tab3.employee_id            = tab2.employee_id
      WHERE tab1.officeid     =123
         AND tab3.space <> 2
      INTERSECT(
              select salary 
              from (
                    select * 
                    from tab4, tab2
                    where  tab4.employee_id  = tab2.employee_id
                    order by effective_d desc
                    )  
              where rownum = 1
              ) > 10000
      

      【讨论】:

      • 它仍然不起作用,因为 tab2 是在内部查询之外声明的。您必须在内部查询中使用它。
      • 是的,这是真的。!在里面声明怎么样。
      【解决方案3】:

      试试这样的:-

      SELECT SUM(tab1.amount) amount
      FROM tab1
      JOIN tab2
      ON tab1.lp_id = tab2.id
      JOIN tab3
      ON tab3.employee_id = tab2.employee_id
      WHERE tab1.officeid     =123
      AND tab3.space <> 2
      AND (
           select salary 
           from (
                select * 
                from tab4 join tab2
                on tab4.employee_id  = tab2.employee_id
                order by effective_d desc
                )  
          where rownum = 1
          ) > 10000
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多