2008-12-17 38 views
0

我有一個3表SQLServer數據庫。如何僅選擇表格中的最新條目?

Project 
ProjectID 
ProjectName 

Thing 
ThingID 
ThingName 

ProjectThingLink 
ProjectID 
ThingID 
CreatedDate 

當事物歸屬於項目時,項目被放入ProjectThingLink表中。 事情可以在項目之間移動。 CreatedDate用於知道哪個項目最後一次移動了。

我正在嘗試創建一個列表,列出當前與其鏈接的所有項目,但是我的大腦失敗了。

有沒有簡單的方法來做到這一點?

回答

2
select p.projectName, t.ThingName 
from projects p 
join projectThingLink l on l.projectId = p.projectId 
join thing t on t.thingId = l.thingId 
where l.createdDate = 
(select max(l2.createdDate) 
    from projectThingLink l2 
    where l2.thingId = l.thingId 
); 

注意:評論

+0

我認爲這個查詢存在問題。即使他們被重新分配,它是否總是顯示分配給項目的所有東西?你需要刪除我認爲的l2.projectid = l.projectid。 – 2008-12-17 15:52:41

+0

謝謝,我現在糾正它。 – 2008-12-17 17:54:32

0

你可以簡單地做後更正

SELECT Project.projectId, Project.ProjectName, ThingName 
FROM Project INNER JOIN ProjectThingLink 
ON Project.ProjectID = ProjectThingLink.ProjectID INNER JOIN 
        Thing ON ProjectThingLink.ThingID = Thing.ThingID 

威爾將獲得與鏈接到像這樣的每一件事每一個項目的列表:

1 | Project1 | SomeThing

1 | Project1 | ThisThing

2 | Project2 | ThatThing

0
select * from project 
inner join (select projectid, 
        max(createdate) as maxdate 
      from projectThingLink 
      group by projectid) as a 
on projectid = a.projectid and createDate = a.maxDate 
1

試試這個:

select p.ProjectID, p.Name, t.ThingID, t.ThingName, l.CreatedDate 
from Project p 
inner join (
    select ProjectID, max(CreatedDate) as CreatedDate 
    from ProjectThingLink 
    group by ProjectID 
) lm on p.ProjectID = l.ProjectID 
inner join ProjectThingLink l on lm.ProjectID = l.ProjectID and lm.CreatedDate = l.CreatedDate 
inner joing Thing t on l.ThingID = t.ThingID 
2

這幾乎總是給您的子查詢方法更好的性能。你基本上是尋找不具有任何其他行過去,而不是最大的日期尋找行的行:

SELECT 
    P.ProjectID, 
    P.ProjectName, 
    T.ThingID, 
    T.ThingName 
FROM 
    dbo.Projects P 
INNER JOIN dbo.ProjectThingLinks PTL1 ON 
    PTL1.ProjectID = P.ProjectID 
LEFT OUTER JOIN dbo.ProjectThingLinks PTL2 ON 
    PTL2.ProjectID = ThingID = PTL1.ThingID AND 
    PTL2.CreatedDate > PTL1.CreatedDate 
INNER JOIN dbo.Things T ON 
    T.ThingID = PTL1.ThingID 
WHERE 
    PTL2.ThingID IS NULL 

一旦你對你的業務規則決定處理的兩行具有相同CreatedDate值可能需要調整查詢。另外,作爲一個附註,一個名爲「Things」的表通常是數據庫設計問題的一個好兆頭。表格應該代表不同的現實生活實體。這種普遍性通常會導致未來的問題。如果這些是資源,那麼他們可能會共享某些屬性,而不僅僅是名稱。也許你的情況是一個非常特殊的情況,但很可能不是。 ;)

相關問題