带连接的sql子查询语句

时间:2015-01-31 21:02:07

标签: sql sql-server join

我无法考虑如何构建符合我需求的sql语句,如果这是不可能的,请告诉我。

我有一张这样的桌子(我不承认这些不会给我带来麻烦)

table:servicio

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

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

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

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

表:评论

------------------------------------------------------------
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

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

我想在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语句检查top(1)并返回其中的区域值?

2 个答案:

答案 0 :(得分:1)

在SQL Server中,您可以使用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;

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

答案 1 :(得分:0)

这是Rownumber和子查询的解决方案。在子查询中,您将选择表之间匹配的所有行。为Comment表日期列创建升序,为每个SWO创建分区(分区意味着它将在每个不同的SWO上重置计数器)。 1 =特定SWO的上次日期。在最终选择中,您只需将WERE子句与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子句