簡體   English   中英

帶有聯接的sql子查詢語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM