mysql - Oracle 语法 & 在自反关系中选择最大和最小行

标签 mysql sql oracle

我正在努力处理涉及自反关系和 Oracle 语法的数据库情况。对于我目前的问题,我能想到的最好的类比是:

关系表:

------------------------------------------------------------
|    PERSON1   |    PERSON2   |    STARTED    |   ENDED    |
------------------------------------------------------------
| Some Guy     | Some Lady    |     1998      |    2000    |
| Some Lady    | Some Guy     |     1998      |    2000    |
|     ....     |     ....     |     ....      |     ....   |
|     ....     |     ....     |     ....      |     ....   |
|     ....     |     ....     |     ....      |     ....   |
|     ....     |     ....     |     ....      |     ....   |
| Another Guy  | Another Lady |     1992      |    2005    |
| Another Lady | Another Guy  |     1992      |    2005    |
------------------------------------------------------------

查询:

我要选择的是最旧的行和最新的行(W.R.T.“STARTED”)。如果这不是自反关系,很容易返回:

------------------------------------------------------------
|    PERSON1   |    PERSON2   |    STARTED    |   ENDED    |
------------------------------------------------------------
| Some Guy     | Some Lady    |     1998      |    2000    |
| Another Guy  | Another Lady |     1992      |    2005    |
------------------------------------------------------------

来自这里:

SELECT PERSON1, PERSON2, STARTED, ENDED
FROM RELATIONSHIPS
WHERE (STARTED) IN
(
    SELECT MAX(STARTED) AS START_YEAR FROM RELATIONSHIPS
    UNION 
    SELECT MIN(STARTED) AS START_YEAR FROM RELATIONSHIPS
);

返回:

------------------------------------------------------------
|    PERSON1   |    PERSON2   |    STARTED    |   ENDED    |
------------------------------------------------------------
| Some Guy     | Some Lady    |     1998      |    2000    |
| Another Guy  | Another Lady |     1992      |    2005    |
| Some Lady    | Some Guy     |     1998      |    2000    |
| Another Lady | Another Guy  |     1992      |    2005    |
------------------------------------------------------------

...当我真的只需要前两行时(不保证顺序)


如果我没有使用 Oracle,我知道我可以使用(除非有人也知道更好的方法)取得一些可接受的结果:

SELECT PERSON1, PERSON2, STARTED, ENDED
FROM RELATIONSHIPS
ORDER BY STARTED DESC
LIMIT 1

UNION

SELECT PERSON1, PERSON2, STARTED, ENDED
FROM RELATIONSHIPS
ORDER BY STARTED ASC
LIMIT 1;

非常感谢您的帮助!谢谢!

最佳答案

这将只返回一个最大行和一个最小行(类似于您的 UNION of LIMIT 1 查询):

Oracle 设置:

CREATE TABLE relationships (PERSON1, PERSON2, STARTED, ENDED) as
  SELECT 'Some Guy'     ,'Some Lady'   ,1998, 2000 FROM DUAL UNION ALL
  SELECT 'Some Lady'    ,'Some Guy'    ,1998, 2000 FROM DUAL UNION ALL
  SELECT 'Another Guy'  ,'Another Lady',1992, 2005 FROM DUAL UNION ALL
  SELECT 'Another Lady' ,'Another Guy' ,1992, 2005 FROM DUAL;

查询:

SELECT person1, person2, started, ended
FROM   (
  SELECT r.*,
         ROW_NUMBER() OVER ( ORDER BY started ASC )  AS rn_asc,
         ROW_NUMBER() OVER ( ORDER BY started DESC ) AS rn_desc
  FROM   relationships r
)
WHERE  rn_asc = 1 OR rn_desc = 1;

输出:

PERSON1      PERSON2     STARTED ENDED
------------ ----------- ------- -----
Some Guy     Some Lady      1998  2000
Another Lady Another Guy    1998  2005

关于mysql - Oracle 语法 & 在自反关系中选择最大和最小行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42338816/

相关文章:

mysql - 具有最大日期的 IN 子句的 LINQ 表达式

php - 使用 PHP 或 SQL 按出现优先级对 MYSQL 结果进行排序

mysql - 如何根据日期选择列的总和

列不明确的 SQL

sql - 如何管理包含大量插入和选择的大表?

mysql - 选择子组中的最新行

mysql - 将表连接到自身并选择不匹配的值

php - 将多个值连接成一行可以在 MySQL 控制台中使用,但不能在 PHP 中使用

python - cx_Oracle 如何将复合/复杂数组传递给 PLSQL 过程?

sql - 无法将查询从 Oracle SQL 传输到具有多个联接的 MS SQL