2014-05-04 98 views
0

我有一個主鍵和一個'第二'鍵的數據庫中的表。第二個鍵可以在表中出現多次,但通常我只想返回第二個鍵的最近一行。我有一個現有的查詢可以在下面使用,但我覺得這很醜陋,應該有一個更簡單的方法來做到這一點,而不是創建一個表變量,通過一個循環,並在每次通過時插入1行到表變量循環。我是否讓這太難?使用多個鍵優化SQL查詢

declare @RowCnt int 
declare @MaxRows int 
declare @secondID as uniqueidentifier 
DECLARE @retList TABLE(
firstGUID uniqueidentifier, 
secondGUID uniqueidentifier, 
name nvarchar(50), 
DateCreated datetime 
) 

select @RowCnt = 1 

declare @Import table (rownum int IDENTITY (1, 1) Primary key NOT NULL , secondGUID uniqueidentifier) 
insert into @Import (secondGUID) SELECT DISTINCT dbo.TestTable.secondGUID FROM dbo.TestTable 

select @MaxRows=count(*) from @Import 
while @RowCnt <= @MaxRows 
begin 
    select @secondID=secondGUID from @Import where rownum = @RowCnt 

    INSERT INTO @retList 
     SELECT  TOP (1) firstGUID,secondGUID,name,datecreated 
     FROM   dbo.TestTable 
     WHERE dbo.TestTable.secondGUID = @secondID 
     ORDER BY DateCreated Desc 

    Set @RowCnt = @RowCnt + 1 
END 

select * from @retList 

編輯: 例如,假設表中有這些值

firstGUID        secondGUID        Name  DateCreated 
    EAD50999-E9B1-43F0-9FA6-615405FA5A9A  6163B6ED-6AF4-494E-ACE6-184F4804847B Test1 2014-04-11 15:12:36.303 
    A9645486-1021-4E98-92AC-1205CC3FB9D3  6163B6ED-6AF4-494E-ACE6-184F4804847B Test2 2014-04-10 15:21:46.087 
    DEE375BB-BFAF-44BE-AC64-06D7702E2ACB  3BD0A2F0-4E44-43B9-BD24-003B518609C7 Test3 
2014-04-11 15:22:37.097 

我只想要返回的測試1和Test3的行。

+0

如果「第二」鍵可出現在表中的多行上,這不是關鍵。無論是主鑰匙還是備用鑰匙,作爲鑰匙,它必須是唯一的。 –

+0

我不是爭論這一點,這就是爲什麼我在報價中。這是一個關鍵,因爲我希望我的查詢的響應只有一個返回該鍵的結果(所以它在查詢中是唯一的),但不是,它在表中不是唯一的。因此複雜的查詢。 – Phil

+0

嚴肅地說,當在關係數據庫中使用「key」這個詞時,它具有明確而明確的含義。如果你在這裏選擇了另外一個詞,你會更好地理解。 –

回答

2

你可以使用SqlServer的分析功能:

select firstGUID, secondGUID, name, datecreated 
from (select t.*, 
      rank() over (partition by secondGUID order by datecreated desc) r 
     from TestTable t) ilv 
where r=1 
+0

這可以工作(謝謝!),因爲它返回與我原始查詢相同的值,但分析函數對我來說是一個全新的領域。這比我上面的設置更快/更好嗎? – Phil

+0

@Phil:我希望*它會更快,因爲它只涉及一遍表格。 –

1

我不是100%確定我明白你在問什麼,但它聽起來像你只想選擇包含max DateCreated的行。這樣做的方式,一般是由子句使用一組子查詢,例如:

select tt.* 
from TestTable tt 
join (
    select firstguid, max(DateCreated) as maxdate 
    from TestTable 
    group by firstguid 
) gtmp on tt.firstguid = gtmp.firstguid and tt.dateCreated = gtmp.maxdate 
加入
+0

爲每個'secondguid'創建的最大日期。意思是我可以有3行,每行都有唯一的'firstguid'值,但是2具有相同的'secondguid'值。我希望我的查詢返回2行。返回的重複'secondguid'行是最近一次。 – Phil

+0

你失去了我在「2排回」。如果您可以編輯您的問題並添加一些表示您擁有的數據以及您想要製作的數據,那麼提出解決方案會更容易。 – thebjorn

+0

查看我添加的修改 – Phil