Sql server 如果不满足限定符,请在选择中选择最低ID

Sql server 如果不满足限定符,请在选择中选择最低ID,sql-server,tsql,Sql Server,Tsql,我有一个查询,根据文档类型提取单个记录。我需要更改它以获取特定“案例”的ID列的最低值,或者如果文档类型为“契约”。可以有多个“契约”记录,我们需要所有这些记录。目前它只提取“主要契约”。我该怎么办 SELECT DocIDKey, CaseNumberKey, Grantee, Grantor, DocID, DocDate, RecDate, PrimaryDocID, RelatedDocID, Interest, DocAmt, DocPath

我有一个查询,根据文档类型提取单个记录。我需要更改它以获取特定“案例”的ID列的最低值,或者如果文档类型为“契约”。可以有多个“契约”记录,我们需要所有这些记录。目前它只提取“主要契约”。我该怎么办

SELECT        
    DocIDKey, CaseNumberKey, Grantee, Grantor, 
    DocID, DocDate, RecDate, PrimaryDocID, RelatedDocID, 
    Interest, DocAmt, DocPath, DocType
FROM            
    Documents
WHERE        
    (CaseNumberKey = @CaseNumberKey) 
    AND (DocType = 'Deed')

这个问题有点让人困惑。你说你需要它来提取最低的案例编号,或者任何DocType为“契据”的东西,但是你显示的查询实际上是任何具有请求的案例编号、DocType为“契据”的东西。它根本不看最小值?“主要契约”是什么,@CaseNumberKey来自何方?这是传递给内联函数或过程的参数,还是基于前面的某个内容计算的参数

假设您运行的是2008年或更高版本,请查看over子句,以及MIN函数。也许是像下面这样的

SELECT        
    DocIDKey, CaseNumberKey, Grantee, Grantor, 
    DocID, DocDate, RecDate, PrimaryDocID, RelatedDocID, 
    Interest, DocAmt, DocPath, DocType
FROM            
    (SELECT 
        ROW_NUMBER() OVER(PARTITION BY CaseNumberKey ORDER BY DocIDKey ASC) AS Row_Num, 
        DocIDKey, CaseNumberKey, Grantee, Grantor, 
        DocID, DocDate, RecDate, PrimaryDocID, RelatedDocID, 
        Interest, DocAmt, DocPath, DocType
    FROM Documents 
    WHERE CaseNumberKey = @CaseNumberKey AND DocType = 'Deed') sub
WHERE Row_Num = 1
这将为您提供与最低DocIDKey值关联的行,其中CaseNumberKey=提供的值,DocType='Dect'。基本上,它所做的是首先在子查询中按DocIDKey对所有内容进行排序,并根据排序为每行提供一个行号,然后仅筛选排序后的第一行

注意:按CaseNumberKey分区部分是可选的,因为您已经按CaseNumberKey进行了筛选

编辑:查看以下注释后修改版本:

SELECT        
    DocIDKey, CaseNumberKey, Grantee, Grantor, 
    DocID, DocDate, RecDate, PrimaryDocID, RelatedDocID, 
    Interest, DocAmt, DocPath, DocType
FROM            
    (SELECT 
        ROW_NUMBER() OVER(PARTITION BY CaseNumberKey ORDER BY DocIDKey ASC) AS Row_Num, 
        DocIDKey, CaseNumberKey, Grantee, Grantor, 
        DocID, DocDate, RecDate, PrimaryDocID, RelatedDocID, 
        Interest, DocAmt, DocPath, DocType
    FROM Documents 
    WHERE CaseNumberKey = @CaseNumberKey) sub
WHERE Row_Num = 1
UNION SELECT 
    DocIDKey, CaseNumberKey, Grantee, Grantor, 
    DocID, DocDate, RecDate, PrimaryDocID, RelatedDocID, 
    Interest, DocAmt, DocPath, DocType
FROM Documents
WHERE CaseNumberKey = @CaseNumberKey AND DocType = 'Deed'

^这将为您提供第一份文档,即具有最低DocIDKey的文档,以及指定CaseNumberKey类型的所有文档。

显示两种情况下的预期输出。您希望为该案例返回1条记录,或者为某个契约返回所有记录?ID是什么?主要契约是如何返回的?VTC请简化您的问题,以提供ddl+dml形式的样本数据和所需结果。绝对需要样本数据和预期结果请阅读有关改进您的问题的一些提示。我不知道从何处开始子查询,因此我给出了我们之前使用的查询。在其他文件名称中有一个“主要契约”,我们过去只使用“主要契约”,但有时“主要契约”不是小于1%的正确文件,因此我们需要将第一份文件添加到案例中,或者在报告中列出所有指定为“契约”的文件,以防标题和多个“契约”混淆控制一个属性。好的。。。我想我明白了我添加了一个新版本-这一版本将为您提供第一个文档,假设第一个文档是具有最低DocIDKey的文档,以及指定CaseNumberKey类型的所有文档。非常感谢!工作完美。由于SSRS不允许使用OVER子句,所以我不得不创建一个存储过程,但它工作得非常好。