sql 带连接的子查询语句

sql subquery statement with a join

我无法思考如何构建满足我需要的 sql 语句,如果这不可能,请告诉我。

我有一个像这样的table(我会忽略那些不会给我造成困难的专栏)

table: 服务

------------------------------------------------------------
id | swo   |        date             | issueValue |

1 |  15-001 |    2015-01-29 01:52:59     |     2

1  | 15-002  |   2015-01-30 01:24:00    |      2

------------------------------------------------------------

table:评论

------------------------------------------------------------
id | swo   |        date             | Area |

1 |  15-001   |  2015-01-29 01:52:59     |     2

1 |  15-002  |   2015-01-30 01:24:00     |     1

1 |  15-002  |   2015-01-30 01:50:00    |      3

------------------------------------------------------------

我想 select servicio 中的行,但包括分配给每个 swo 的最新区域。结果应该是这样的。

------------------------------------------------------------
id | swo   |        date             | Area |

1 |  15-001 |    2015-01-29 01:52:59     |     2

1  | 15-002  |   2015-01-30 01:24:00    |      3

------------------------------------------------------------

那么如何让 sql 语句检查顶部 (1) 和 return 其中的面积值?

在 SQL 服务器中,您可以使用 apply、子查询或 row_number() 执行此操作。这是第一种方法:

select s.*, c.area
from servicio s outer apply
     (select top 1 c.*
      from comments c
      where c.swo = s.swo
      order by c.date desc
     ) c;

使用此方法,您可以根据需要拉出其他列。

这是使用 Rownumber 和子查询的解决方案。在子查询中,您正在 selecting 所有在 table 之间匹配的行。为注释 table 日期列创建升序,为每个 SWO 分区(分区意味着它将在每个不同的 SWO 上重置计数器)。 1 = 特定 SWO 的最后日期。在最后的 select 中,您只需将 WHERE 子句与 Rownum = 1

SELECT swo ,date ,issueValue ,Area
FROM 
(SELECT 
     SRV.swo
    ,SRV.date
    ,SRV.issueValue
    ,CMNT.Area
    ,ROW_NUMBER() OVER (PARTITION BY CMNT.swo ORDER BY CMNT.date DESC) AS Dsc_Rank
 FROM servicio AS SRV
 LEFT JOIN comments AS CMNT
        ON (SRV.swo=CMNT.swo)
) AS Temp
WHERE Temp.Dsc_Rank = 1 /* Descending Date Rank 1 = Latest date from Comment table*/

注意:例如在 Teradata 中您可以省略子查询并使用 Qualify 子句