2015-09-08 121 views
-1

考慮採用以下結構中的三個表和條目:MS SQL:查詢多個表

project 
------- 
projectGuid | projectName | emailEmployer | emailEmployee 
________________________________________________________ 
AB   | tiger  | [email protected] | NULL 
CD   | snake  | NULL   | [email protected] 


projectHistory 
-------------- 
historyGuid | projectGuid | historyTimestamp | statusId 
_______________________________________________________ 
ST   | AB   | 2015-08-11 15:18:09.047 | 1 
UV   | AB   | 2015-08-16 15:20:10.100 | 2 
WX   | CD   | 2015-07-12 15:04:03.018 | 1 


status 
------ 
statusId | statusDisplay 
________________________ 
1  | created 
2  | start 

如何查詢模樣實現以下的輸出:

projectGuid | projectName | emailEmployer | emailEmployee | historyTimestamp | statusId | statusDisplay 
_______________________________________________________________________________________________________ 
AB   | tiger  | [email protected] | NULL   | 2015-08-16 15:20:10.100 | 2 | start 
CD   | snake  | NULL   | [email protected] | 2015-07-12 15:04:03.018 | 1 | created 

由於是attribut emailEmployeremailEmployee我只想要項目的最後一個historyTimestamp

回答

0

沿東西這行應該做的伎倆:

SELECT p.projectGuid 
    , p.projectName 
    , p.emailEmployer 
    , p.emailEmployee 
    , ph.historyTimestamp 
    , s.statusId 
    , s.statusDisplay 
    FROM project p 
    JOIN (SELECT projectGuid 
      , MAX(historyTimestamp) AS historyTimestamp 
      , MAX(statusId) AS statusId 
      FROM projectHistory   
     GROUP BY projectGuid) ph 
    ON p.projectGuid = ph.projectGuid 
    JOIN status s 
    ON ph.statusId = s.statusId 
WHERE (p.emailEmployer = @email OR p.emailEmployee = @email) 

@email是email屬性的參數。

+0

SSMS顯示以下錯誤信息:「多部分標識符'ph.statusId'不能綁定。「任何想法? – mod

+0

我的錯誤,複製並粘貼錯誤,現在就試試 – Mack

1

你也許可以使用CTEsubquery做到這一點:

子查詢:

DECLARE @email varchar(255); 

SELECT p.projectguid 
    ,p.projectname 
    ,p.emailEmployer 
    ,p.emailEmployee 
    ,ph.historyTimestamp 
    ,ph.statusid 
    ,s.statusDisplay 
FROM project p 
INNER JOIN (
    SELECT projectguid 
     ,max(historyTimestamp) AS historyTimestamp 
     ,max(statusid) AS statusid 
    GROUP BY projectguid 
    ) ph ON ph.projectguid = p.projectguid 
INNER JOIN [status] s ON s.statusid = ph.statusid 
WHERE (p.emailEmployer = @email OR p.emailEmployee = @email) 

CTE:

DECLARE @email varchar(255); 

;with ph as 
(SELECT projectguid 
     ,max(historyTimestamp) 
     ,max(statusid) AS statusid AS historyTimestamp 
    GROUP BY projectguid 
) 
SELECT p.projectguid 
    ,p.projectname 
    ,p.emailEmployer 
    ,p.emailEmployee 
    ,ph.historyTimestamp 
    ,ph.statusid 
    ,s.statusDisplay 
FROM project p 
INNER JOIN ph ON ph.projectguid = p.projectguid 
INNER JOIN [status] s ON s.statusid = ph.statusid 
WHERE (p.emailEmployer = @email OR p.emailEmployee = @email)