【问题标题】:Fetching the rows from db table从 db 表中获取行
【发布时间】:2020-02-24 17:32:16
【问题描述】:

下面是我的数据库表。

 RECORDNO| STAGE| COMMENT | STATE
 12      | 1    | abcd    | P
 13      | 1    | adfg    | P
 14      | 2    | adsds   | P
 15      | 2    | defe    | P

我想获取 State'P' 和 stage = stage of minimum recordno 的记录;

SELECT * 
  FROM history 
 WHERE STATE = 'P' 
   AND recordNO = ( SELECT MIN(record#) 
                      FROM history 
                     WHERE STATE = 'P' ) ;

上面的查询只给出记录号为 12 的行。我想获取记录号为 12 和 13 的行。 请帮我查询。

【问题讨论】:

  • 您的 DBMS 和版本是什么?

标签: mysql sql oracle


【解决方案1】:

MySql 使用这个:

SELECT h.* FROM history h
WHERE  h.STATE = 'P' 
   AND h.STAGE = (SELECT STAGE FROM history WHERE STATE = h.STATE ORDER BY RECORDNO LIMIT 1);

WHERE 子句中的子查询返回最小记录号的阶段。
请参阅demo

对于 Oracle 12c+,将 LIMIT 1 更改为:

FETCH FIRST 1 ROWS ONLY

请参阅demo

结果:

| RECORDNO | STAGE | COMMENT | STATE |
| -------- | ----- | ------- | ----- |
| 12       | 1     | abcd    | P     |
| 13       | 1     | adfg    | P     |

【讨论】:

    【解决方案2】:

    甲骨文:

        select * from history
        where stage in 
            ( select stage from history where recordno = 
                ( select min(recordno) from history where state = 'P' )
            );
    

    演示here

    【讨论】:

      【解决方案3】:

      STAGE 列的子查询匹配,最小为 STAGE

      SELECT h1.* 
        FROM history h1
       WHERE h1.STATE = 'P' 
         AND h1.STAGE = (SELECT MIN(STAGE) FROM history );
      

      或通过 JOIN 关键字的内联视图

      SELECT h1.* 
        FROM history h1
        JOIN (SELECT MIN(STAGE) AS STAGE FROM history ) h2
          ON h2.STAGE = h.STAGE
       WHERE h1.STATE = 'P'; 
      

      对于两个 DBMS(MySQL&Oracle)。

      【讨论】:

        猜你喜欢
        • 2021-11-11
        • 2020-11-21
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        相关资源
        最近更新 更多