Sql 通过变量获取第一行编号

Sql 通过变量获取第一行编号,sql,Sql,我有一个如下的代码,我想提取表中的第一个rownu=1,但是当我在where语句中写入它时,我得到一个错误: SELECT * FROM (SELECT VID, SPRTELE_PHONE_NUMBER AS Phone, ROW_NUMBER() OVER (PARTITION BY VID ORDER BY SPRTELE_TELE_cODE desc) AS ROWNU FROM

我有一个如下的代码,我想提取表中的第一个rownu=1,但是当我在where语句中写入它时,我得到一个错误:

SELECT 
    * 
FROM 
    (SELECT  
         VID,
         SPRTELE_PHONE_NUMBER AS Phone,
         ROW_NUMBER() OVER (PARTITION BY VID ORDER BY SPRTELE_TELE_cODE desc) AS ROWNU         
     FROM 
         PERSONNEL_VIEW, SPRTELE 
     WHERE     
         SPRTELE_PIDM = PIDM   
         AND (SPRTELE_SEQNO = (SELECT MAX (SPRTELE_SEQNO)
                               FROM SPRTELE
                               WHERE SPRTELE_PIDM = PIDM)))
    ) DATA
WHERE 
    DATA.ROWNU = 1

UNION

SELECT
    *  
FROM
    (SELECT 
         VID,
         SPRTELE_PHONE_NUMBER AS Phone,
         '1' AS ROWNU
     FROM 
         STUDENT_VIEW, SPRTELE
     WHERE     
         SPRTELE_PIDM = PIDM  
         AND (SPRTELE_SEQNO = (SELECT MAX (SPRTELE_SEQNO)
                               FROM SPRTELE
                               WHERE SPRTELE_PIDM = PIDM))
         AND TERM_CODE = '201920'
    ) DATA
WHERE
    data.rownu = 1;
输出类似于

VID           PHONE    ROWNU
-----------------------------
VI1003365     5891449     1
VI2380659     4932389     1
VI2997998     6371006     1 
VI2997998     5821347     2

我只需要拉取rownu=1,但在代码中放入rownu=1时出现错误。

您需要为此创建一个子查询:

SELECT * 
FROM (
  SELECT vid, 
   sprtele_phone_number                 AS Phone, 
   Row_number() 
     OVER ( 
       partition BY vid 
       ORDER BY sprtele_tele_code DESC) AS ROWNU 
   FROM   personnel_view, 
       sprtele 
   WHERE  sprtele_pidm = pidm 
       AND ( sprtele_seqno = (SELECT Max (sprtele_seqno) 
                              FROM   sprtele 
                              WHERE  sprtele_pidm = pidm) )
) DATA
WHERE DATA.ROWNU =1; 
您可以在此处阅读原因:

-编辑-

如果查询变得更复杂,可以使用WITH子句,如下所示:

WITH UNION_DATA AS ( 
  SELECT  VID,
          SPRTELE_PHONE_NUMBER    AS Phone,
          ROW_NUMBER()
          OVER (
             PARTITION BY VID 
             ORDER BY SPRTELE_TELE_cODE desc)  AS ROWNU         
  FROM PERSONNEL_VIEW ,  SPRTELE 
  WHERE     SPRTELE_PIDM = PIDM   
        AND (SPRTELE_SEQNO =
            (SELECT MAX (SPRTELE_SEQNO)
               FROM SPRTELE
                  WHERE SPRTELE_PIDM = PIDM ))
  UNION
  SELECT VID,
      SPRTELE_PHONE_NUMBER    AS Phone,
      '1'  AS ROWNU
  FROM STUDENT_VIEW, SPRTELE
  WHERE     SPRTELE_PIDM = PIDM  
       AND (SPRTELE_SEQNO =
            (SELECT MAX (SPRTELE_SEQNO)
               FROM SPRTELE
              WHERE SPRTELE_PIDM = PIDM ))
       AND TERM_CODE = '201920')
SELECT *
FROM UNION_DATA UD 
WHERE UD.ROWNU = 1

阅读WITH子句的更多信息:

如果我需要为此代码添加union,该怎么办。让我编辑我输入的代码。感谢您的快速响应。它为第二行提供了错误,其中以select开头?在名称后面缺少AS,其中UNION_数据为…-早在25年前,ANSI-92 SQL标准中就用正确的ANSI联接语法替换了老式的逗号分隔的表列表样式,并且不鼓励使用这种样式。现在仍然支持老式的逗号分隔联接。