2015-01-31 106 views
0

我無法考慮如何構建符合我需要的sql語句,如果這不是可能,請讓我知道。加入的SQL子查詢語句

我有這樣一個表(生病ommit不做dificulties給我列)

表: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語句檢查頂部(1)並返回其中的區域值?

+0

請標記與您正在使用的數據庫你的問題。 – 2015-01-31 21:02:32

+0

對不起,編輯標籤 – 2015-01-31 21:03:30

回答

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; 

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

+0

工作就像一個魅力,謝謝, – 2015-01-31 21:16:47

0

這是Rownumber和子查詢的解決方案。在子查詢中,您可以選擇表格之間匹配的所有行。爲評論表日期列創建升序,爲每個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的,你可以省略子查詢,並使用資格條款