使用多个键优化SQL查询
我在数据库中有一个表,它有一个主键,还有一个“第二”键。第二个键可以在表中多次出现相同的值,但通常我只想返回第二个键的最近一行。我有一个可以在下面工作的现有查询,但我觉得它非常难看,应该有一种更简单的方法来实现这一点,而不是创建一个表变量,遍历一个循环,并在每次遍历循环时向表变量插入一行。我是不是太难了使用多个键优化SQL查询,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我在数据库中有一个表,它有一个主键,还有一个“第二”键。第二个键可以在表中多次出现相同的值,但通常我只想返回第二个键的最近一行。我有一个可以在下面工作的现有查询,但我觉得它非常难看,应该有一种更简单的方法来实现这一点,而不是创建一个表变量,遍历一个循环,并在每次遍历循环时向表变量插入一行。我是不是太难了 declare @RowCnt int declare @MaxRows int declare @secondID as uniqueidentifier DECLARE @retList T
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
我只希望返回Test1和Test3行。我不能100%确定我是否理解您的要求,但听起来您似乎只希望选择包含max DateCreated的行。通常的做法是与使用GROUPBY子句的subselect联接,例如:
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
我不能100%确定我理解您的要求,但听起来您只想选择包含max DateCreated的行。通常的做法是与使用GROUPBY子句的subselect联接,例如:
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
我不能100%确定我理解您的要求,但听起来您只想选择包含max DateCreated的行。通常的做法是与使用GROUPBY子句的subselect联接,例如:
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
我不能100%确定我理解您的要求,但听起来您只想选择包含max DateCreated的行。通常的做法是与使用GROUPBY子句的subselect联接,例如:
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
您可以使用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
您可以使用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
您可以使用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
您可以使用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
如果“第二个”键可以出现在表中的多行上,则它不是键。无论它是主键还是备用键,要成为一个键,它必须是唯一的。我不是在争论这一点,这就是为什么我在引号中有它。它是一个键,我希望查询的响应只从该键返回一个结果(因此它在查询中是唯一的),但不,它在表中不是唯一的。因此就产生了复杂的查询。说真的,在关系数据库的上下文中使用“key”一词时,它的含义是明确的,并且可以很好地理解。如果为此处的意思选择另一个单词,您会更好地理解。如果“第二个”键可以出现在表中的多行上,则它不是键。无论它是主键还是备用键,要成为一个键,它必须是唯一的。我不是在争论这一点,这就是为什么我在引号中有它。它是一个键,我希望查询的响应只从该键返回一个结果(因此它在查询中是唯一的),但不,它在表中不是唯一的。因此就产生了复杂的查询。说真的,在关系数据库的上下文中使用“key”一词时,它的含义是明确的,并且可以很好地理解。如果为此处的意思选择另一个单词,您会更好地理解。如果“第二个”键可以出现在表中的多行上,则它不是键。无论它是主键还是备用键,要成为一个键,它必须是唯一的。我不是在争论这一点,这就是为什么我在引号中有它。它是一个键,我希望查询的响应只从该键返回一个结果(因此它在查询中是唯一的),但不,它在表中不是唯一的。因此就产生了复杂的查询。说真的,在关系数据库的上下文中使用“key”一词时,它的含义是明确的,并且可以很好地理解。如果为此处的意思选择另一个单词,您会更好地理解。如果“第二个”键可以出现在表中的多行上,则它不是键。无论它是主键还是备用键,要成为一个键,它必须是唯一的。我不是在争论这一点,这就是为什么我在引号中有它。它是一个键,我希望查询的响应只从该键返回一个结果(因此它在查询中是唯一的),但不,它在表中不是唯一的。因此就产生了复杂的查询。说真的,在关系数据库的上下文中使用“key”一词时,它的含义是明确的,并且可以很好地理解。如果为此处的意思选择另一个词,您会更好地理解。为每个“secondguid”创建的最大日期。这意味着我可以有3行,每行都有唯一的“firstguid”值,但2行有相同的“secondguid”值。我希望我的查询返回2行。返回的重复“secondguid”行是最近的一行。您在“返回2行”时丢失了我。如果您可以编辑您的问题并添加一些表示您所拥有的以及您希望生成的内容的数据,那么就更容易找到解决方案。为每个“secondguid”创建的最大日期。这意味着我可以有3行,每行都有唯一的“firstguid”值,但2行有相同的“secondguid”值。我希望我的查询返回2行。返回的重复“secondguid”行是最近的一行。您在“返回2行”时丢失了我。如果您可以编辑您的问题并添加一些表示您所拥有的以及您希望生成的内容的数据,那么就更容易找到解决方案。为每个“secondguid”创建的最大日期。这意味着我可以有3行,每行都有唯一的“firstguid”值,但2行有相同的“secondguid”值。我希望我的查询返回2行。返回的重复“secondguid”行是最近的一行。您在“返回2行”时丢失了我。如果您可以编辑您的问题并添加一些表示您所拥有的以及您希望生成的内容的数据,那么就更容易找到解决方案。为每个“secondguid”创建的最大日期。这意味着我可以有3行,每行都有唯一的“firstguid”值,但2行有相同的“secondguid”值。我希望我的查询返回2行。返回的重复“secondguid”行是最近的一行。您在“返回2行”时丢失了我。如果可以的话