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 子句
我无法思考如何构建满足我需要的 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 子句