[英]sql subquery statement with a join
我無法考慮如何構建適合我需求的sql語句,如果這不是可能的話,請告訴我。
我有這樣的一張桌子(我會省略那些沒有使我煩惱的列)
表:服務
------------------------------------------------------------
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的最新Area。 結果應該是這樣的。
------------------------------------------------------------
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)並返回其中的area值?
在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;
使用此方法,可以根據需要提取其他列。
這是行號和子查詢的解決方案。 在子查詢中,您選擇表之間匹配的所有行。 為注釋表日期列創建升序,對每個SWO進行分區(分區意味着它將在每個不同的SWO上重置計數器)。 1 =特定SWO的最后日期。 在最終選擇中,只需將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子句
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.