【问题标题】:SELECT clause with exist condition具有存在条件的 SELECT 子句
【发布时间】:2014-05-08 13:07:18
【问题描述】:

表名:RANKTITLE,RANK

//RANKTITLE
TITLE
--------------
TEST1
TEST2
TEST3
TEST4

//RANK
TITLE         SALARY
---------------------
TEST1         4500000
TEST2          80000
TEST3          26000
TEST4         1800000

所以我想显示除薪水最高的排名以外的所有标题

输出如下:

TITLE         SALARY
--------------------
TEST2          80000
TEST3          26000
TEST4         1800000

使用这个查询

SELECT r.TITLE FROM RANKTITLE r WHERE
r.TITLE IN (SELECT TITLE FROM RANK) AND 
(SELECT MAX(SALARY) FROM RANK WHERE r.TITLE=p.TITLE AND SALARY < MAX(SALARY));

我无法得到我想要的输出。这里没有错吗?

【问题讨论】:

  • 如果两个职位的薪水一样高怎么办?他们都被排除在外了吗?
  • 另外,RANKTITLE 中是否存在 RANK 中可能不存在的标题?它们也应该显示吗?
  • @MichaelBerkowski 是的。两者都被排除在外
  • 等等,是第二个问题还是第一个问题?

标签: sql oracle


【解决方案1】:
SELECT r.TITLE, salary FROM RANK r WHERE
salary not in (SELECT MAX(SALARY) FROM RANK);

如果您只有一个排名最高的记录,则只有它会被排除。 如果您有多个最高级别的记录,则所有记录都将被排除。

select title from (
SELECT TITLE, rownum rnum FROM RANK  
ORDER by salary desc, title)
where rnum <> 1;

将仅排除倒霉的第一条记录。您甚至不需要 RANKTITLE,除非您想获取更多字段。

【讨论】:

    【解决方案2】:

    测试一下:

    SELECT r.TITLE, r.SALARY
    FROM RANKTITLE r
    WHERE r.SALARY < (SELECT MAX(s.SALARY) FROM RANK s)
    

    【讨论】:

      【解决方案3】:

      试试这个查询:

      select r.title,r.salary from rank r
      except
      select r1.title,(select max(s.salary) from rank s)
      from rank r1
      

      【讨论】:

        猜你喜欢
        • 2014-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-26
        相关资源
        最近更新 更多