Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多个键优化SQL查询_Sql_Sql Server_Stored Procedures - Fatal编程技术网

使用多个键优化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行”时丢失了我。如果可以的话