我有一个主键和一个'第二'键的数据库中的表。第二个键可以在表中出现多次,但通常我只想返回第二个键的最近一行。我有一个现有的查询可以在下面使用,但我觉得这很丑陋,应该有一个更简单的方法来做到这一点,而不是创建一个表变量,通过一个循环,并在每次通过时插入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的行。
如果“第二”键可出现在表中的多行上,这不是关键。无论是主钥匙还是备用钥匙,作为钥匙,它必须是唯一的。 –
我不是争论这一点,这就是为什么我在报价中。这是一个关键,因为我希望我的查询的响应只有一个返回该键的结果(所以它在查询中是唯一的),但不是,它在表中不是唯一的。因此复杂的查询。 – Phil
严肃地说,当在关系数据库中使用“key”这个词时,它具有明确而明确的含义。如果你在这里选择了另外一个词,你会更好地理解。 –