【问题标题】:order by in inner join while updating table更新表时在内部连接中排序
【发布时间】:2015-07-09 02:14:18
【问题描述】:

我需要通过内部连接另一个表来更新一个表。下面是例子。

Employee table:

role        name    Time create
manager     abc      2013
sales       def      2014
manager     xyz      2015
sales       dje      2015

Currentteam:

role      name
manager 
sales

我需要使用员工表中的名称更新 Currentteam 表,但我需要更新 manager 角色的最近名称含义。我们在Employee 表中有两个名称,但我只需要更新一个最近的名称,即XYZ。我试图做类似下面的事情,但它不允许在子查询中使用order by

Update currentteam
Set name=temp.name
From currentteam
Inner join (select * from employee order by timecreate) as temp on temp.role=currentteam

请指教!!!

【问题讨论】:

  • 请选择您正在使用的数据库并标记适当的。 MySQL SQL Server。
  • "请指教!!!" --- 为什么不礼貌地问好?
  • 对不起,我不是很好,但我不是故意的..

标签: sql sql-server sql-update inner-join


【解决方案1】:

您可以使用相关子查询:

SQL Fiddle

UPDATE  ct
    SET ct.name = (
        SELECT TOP 1 name
        FROM Employee e
        WHERE e.role = ct.role
        ORDER BY TimeCreate DESC
    )
FROM CurrentTeam ct

结果:

|    role | name |
|---------|------|
| manager |  xyz |
|   sales |  dje |

【讨论】:

  • 很高兴能帮上忙!
【解决方案2】:

看起来您正在使用 SQL Server。如果是这样,row_number() 来救援:

Update currentteam
    Set name = temp.name
From currentteam Inner join
     (select e.*,
             row_number() over (partition by role order by timecreate desc) as seqnum
      from employee e
     ) temp
     on temp.role = currentteam and seqnum = 1;

【讨论】:

  • 这也有效,但 wewestthemenace 提供的查询不太复杂,所以我将其标记为答案。谢谢您的回复。
  • @Vicky 。 . .这个答案似乎更简单。
猜你喜欢
  • 2011-05-03
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 2013-04-24
相关资源
最近更新 更多