SQL |有关系条款
这篇文章是 SQL Offset-Fetch 子句的延续
现在,我们了解了如何在 Oracle 数据库中使用 Fetch 子句以及指定的偏移量,并且我们也了解了 Fetch 子句是 Oracle 数据库 12c 中新增的子句,或者它是 Oracle 数据库 12c 中添加的新功能。
现在考虑下面的例子:
假设我们有一个名为myTable的表,其中包含以下数据:
ID NAME SALARY
-----------------------------
1 Geeks 10000
4 Finch 10000
2 RR 6000
3 Dhoni 16000
5 Karthik 7000
6 Watson 10000
现在,假设我们希望前三行按 Salary 降序排列,那么必须执行以下查询:
Query:
SELECT * from myTable
order by salary desc
fetch first 3 rows only;
Output:
We got only first 3 rows order by Salary in Descending Order
ID NAME SALARY
--------------------------
3 Dhoni 16000
1 Geeks 10000
4 Finch 10000
注意:在上面的结果中,我们得到了前 3 行,按 Salary 降序排列,但是我们还有一行具有相同的薪水,即名为Watson和 Salary 10000的行,但它没有出现,因为我们限制了我们的输出只到前三行。但这并不是最优的,因为大多数时候在实时应用程序中,我们还需要显示绑定的行。
现实生活中的例子– 假设我们有 10 位赛车手参赛,我们只有 3 个奖项,即第一、第二、第三,但是假设赛车手 3 和 4 同时完成了比赛,所以在这种情况下,我们有 3 人之间的平局和 4,这就是为什么两者都是位置 3 的持有者。
有领带
因此,为了克服上述问题,Oracle 引入了一个称为With Ties子句的子句。现在,让我们看看我们之前使用 With Ties 子句的示例。
Query:
SELECT * from myTable
order by salary desc
fetch first 3 rows With Ties;
Output:
See we get only first 3 rows order by Salary in Descending Order along with Tied Row also
ID NAME SALARY
--------------------------
3 Dhoni 16000
1 Geeks 10000
6 Watson 10000 // We get Tied Row also
4 Finch 10000
现在,看到我们也得到了并列的行,这是我们以前没有得到的。
注意:只有当我们在 Select 语句中使用order by子句时,我们才会在输出中得到绑定行。假设,如果我们不使用 order by 子句,并且仍然使用with ties子句,那么我们将不会在输出中获得绑定行,并且查询的行为与使用ONLY子句而不是With Ties 的行为相同条款。
示例– 假设我们执行以下查询(不使用 order by 子句):
Query:
SELECT * from myTable
fetch first 3 rows With Ties;
Output:
See we won't get the tied row because we didn't use order by clause
ID NAME SALARY
--------------------------
1 Geeks 10000
4 Finch 10000
2 RR 6000
在上面的结果中,我们不会得到绑定行,我们只得到前 3 行。因此, With Ties与order by子句绑定,即当且仅当我们将 With Ties 与 Order by 子句一起使用时,我们才能在输出中获得绑定的行。
注意:请确保,您在 Oracle Database 12c 中运行这些查询,因为 Fetch 子句是 Oracle 12c 中新增的功能,同样 With Ties,仅在 Oracle Database 12c 中运行,这些查询不会在 12c 的以下版本中运行比如 10 克或 11 克。
参考s:关于Fetch子句以及With Ties子句,在线执行SQL查询