简体   繁体   English

如何在 SQL 中加入带有 row_number() 函数的语句?

[英]How to join to a statement with a row_number() function in SQL?

I a SQL with a row_number() function, and I would like to join on additional tables to get the fields below.我是一个带有 row_number() 函数的 SQL,我想加入其他表以获取以下字段。 How would I accomplish this?我将如何做到这一点?

Desired fields:所需字段:

EMPLOYEE.EMPLID 
  EMPLOYEE.JOBTITLE
  NAME.FIRST_NAME
  NAME.LAST_NAME
  LOCATION.ADDRESS
  PROFESSIONAL_NAME.PROF_NAME 

Beginning SQL:开始 SQL:

SELECT COUNT(*) 
FROM 
    (
        SELECT EMPLOYEE.*, ROW_NUMBER() OVER (PARTITION BY EMPLID ORDER BY 
        PRIM_ROLE_IND DESC, EMPL_RCD ASC) as RN
        FROM EMPLOYEE
        WHERE JOB_INDICATOR = 'P'
    ) dt
WHERE RN = 1

When I try to add a left join at the end, I get an error that says "EMPLOYEE"."EMLID" invalid identifier.当我尝试在末尾添加左连接时,我收到一条错误消息,显示“EMPLOYEE”。“EMLID”无效标识符。

What I'm trying:我正在尝试什么:

SELECT 
  EMPLOYEE.EMPLID, 
  EMPLOYEE.JOBTITLE,
  NAME.FIRST_NAME, 
  NAME.LAST_NAME, 
  LOCATION.ADDRESS,
  PROFESSIONAL_NAME.PROF_NAME 
FROM 
    (
        SELECT EMPLOYEE.*, ROW_NUMBER() OVER (PARTITION BY EMPLID ORDER BY 
        PRIM_ROLE_IND DESC, EMPL_RCD ASC) as RN
        FROM EMPLOYEE
        WHERE JOB_INDICATOR = 'P'
    ) 
    
    LEFT JOIN NAME ON EMPLOYEE.EMPLID = NAME.EMPLID 
WHERE 
  RN = 1
  AND
  NAME.EFFDT = (
    SELECT 
      MAX (NAME2.EFFDT) 
    FROM 
      NAME NAME2 
    WHERE 
      NAME2.EMPLID = NAME.EMPLID 
      AND NAME.NAME_TYPE = 'PRI'
  )  
  AND EMPLOYEE.JOB_INDICATOR = 'P'

You just need to alias your table你只需要给你的表起别名

...
(
    SELECT EMPLOYEE.*, ROW_NUMBER() OVER (PARTITION BY EMPLID ORDER BY 
    PRIM_ROLE_IND DESC, EMPL_RCD ASC) as RN
    FROM EMPLOYEE
    WHERE JOB_INDICATOR = 'P'
) temp_employee --add this
LEFT JOIN NAME ON temp_employee.EMPLID = NAME.EMPLID 
...

When you create your new table with row_number() in an inner select you essentially create a new table.当您在内部选择中使用 row_number() 创建新表时,您实际上是在创建一个新表。 You need to alias or name this table and then refer to that alias.您需要给该表起alias或命名,然后引用该别名。 In the above your from is the inner select, not the EMPLOYEE table.在上面,您的from是内部选择,而不是 EMPLOYEE 表。 See below for simplified example.请参阅下面的简化示例。

select newtable.field from (select field from mytable) newtable 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM