SQL 最近从第二个表注册的 Id

Posted

技术标签:

【中文标题】SQL 最近从第二个表注册的 Id【英文标题】:SQL Most Recent Register FROM Second Table by Id 【发布时间】:2018-08-07 17:25:27 【问题描述】:

我有 2 张桌子(机会和舞台)。我需要通过 StageTypeId 获得最近阶段的每个机会。

机会:ID 等 阶段:Id、CreatedOn、OpportunityId、StageTypeId。

假设我有“opportunity1”和“opportunity2”,每个都添加了许多阶段。

通过传递 StageTypeId,我需要获得具有此 StageTypeId 的最新机会。

我正在尝试以下查询,但它为所有机会复制了相同的阶段。

似乎忽略了这一行:“AND Stage.[OpportunityId] = ID”

SELECT Opportunity.[Id] ID,
       Opportunity.[Name],
       Opportunity.[PotentialAmount],
       Contact.[FirstName], 
       Contact.[LastName],
       (SELECT * FROM 
            (
                SELECT Stage.[StageTypeId]
                  FROM Stage         
                 WHERE Stage.[StageTypeId] = @StageTypeId  
                   AND Stage.[OpportunityId] = ID       
                 ORDER BY Stage.[CreatedOn] DESC
            ) 
        WHERE ROWNUM = 1) AS StageTypeId     
 FROM Opportunity
 LEFT JOIN Contact 
   ON Opportunity.[ContactId] = Contact.[Id]

谢谢

【问题讨论】:

标记您正在使用的 DBMS(即mysqlSQL Server 等)。 数据库是什么? 它是甲骨文.... 【参考方案1】:

大多数 DBMS 支持fetch first 子句所以,你可以这样做:

select o.*
from Opportunity o
where o.StageTypeId = (select s.StageTypeId 
                       from Stage s
                       where s.OpportunityId = o.id
                       order by s.CreatedOn desc
                       fetch first 1 rows only
                      );

【讨论】:

我认为有问题,StageTypeId 在 Stage 表而不是机会表中。对吗?【参考方案2】:

您可以尝试以下所有 dbms 都支持的方式

   select TT*. ,o*. from
   (
   select s1.OpportunityId,t.StageTypeId from Stage s1 inner join

    (select StageTypeId,max(CreatedOn) as createdate Stage s
    group by StageTypeId
    ) t
    on s1.StageTypeId=t.StageTypeId and s1.CreatedOn=t.createdate 
   ) as TT inner join Opportunity o on TT.OpportunityId=o.id

【讨论】:

以上是关于SQL 最近从第二个表注册的 Id的主要内容,如果未能解决你的问题,请参考以下文章

SQL LEFT JOIN 从第二个表中排除两条记录

Microsoft SQL 查询 - 从第二个表返回最后一条记录

从第二个表存储过程mysql中仅通过其ID选择一个图像

使用第一个表的输出从第二个表中选择特定数据

在多个连接条件下将数据从第二个表插入一个表

将第二个表中的第二个(条件)结果添加到 SQL 查询