我看过一个查询,在表格中找到第n个最高薪水;
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
可以解释这是如何工作的?什么是"WHERE(n)"
这里的意思
答案 0 :(得分:1)
它被称为row constructor。
对于您的案例(scalar subquery
),括号是多余的,您只能使用:
SELECT *
FROM one one1
WHERE n = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
但是当你需要比较多个值时它很有用:
SELECT *
FROM t1
WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
答案 1 :(得分:1)
编写查询时,对所有列使用表别名非常有用:
SELECT one1.*
FROM one one1
WHERE 2 = (SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
);
这是做什么的?对于one1
中的每一行,子查询计算的薪水大于或大于该行的行数。
对于具有最大薪水的行,子查询返回的计数是具有最大值的行数。如果我们假设工资值不同,那么这就提供了排名。当值为2时,我们得到第二大值。
但是,您可能无法获得值“2” - 例如,如果三行绑定最大值。那么最高薪水的价值将是“3”。你可能想要“1”,所以更好的结构是:
然而,这种假设并非总是如此。因此,编写此构造的更好方法是:
SELECT one1.*
FROM one one1
WHERE 2 = (SELECT 1 + COUNT( one2.salary )
FROM one one2
WHERE one2.salary > one1.salary
);
以上等同于ANSI标准rank()
功能。通常,你真的想知道第二高的不同的薪水(忽略关系)。这是ANSI标准dense_rank()
函数,使用以下函数实现:
SELECT one1.*
FROM one one1
WHERE 2 = (SELECT 1 + COUNT(DISTINCT one2.salary )
FROM one one2
WHERE one2.salary > one1.salary
);
答案 2 :(得分:0)
但是当你需要比较多个值时它很有用:
SELECT * 从t1 WHERE(col1,col2)=(SELECT col3,col4 FROM t2 WHERE id = 10);