在SQL中显示数字的第一个实例。不同的,内部连接和连接不完全起作用

在SQL中显示数字的第一个实例。不同的,内部连接和连接不完全起作用,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我试图做的是,当存在多个solinenumber实例时,仅显示sonumber的第一个实例。我尝试过使用distinct…groupby,内部连接和连接,但没有成功。我显然遗漏了一些东西,因为无论我如何做,我都会得到以下结果: sonumber | solinenumber ----------------------- 00316510 | 0090 ----------------------- 00316510 | 0100 ----------------------- 00316510

我试图做的是,当存在多个
solinenumber
实例时,仅显示
sonumber
的第一个实例。我尝试过使用
distinct…groupby
内部连接
连接
,但没有成功。我显然遗漏了一些东西,因为无论我如何做,我都会得到以下结果:

sonumber | solinenumber
-----------------------
00316510 | 0090
-----------------------
00316510 | 0100
-----------------------
00316510 | 0160
-----------------------
00316510 | 0170
我目前使用的代码如下。我可以在必要时发布我如何使用
Distinct…groupby
内部连接
,以及
连接

Select  so.sonumber, 
        sol.SOLineNumber

From    tblsoso so, 
        tblsoSOLine sol,
        tblsosolinerep tlr

where   so.SONumber = '00316510' AND
        sol.SONumber = so.SONumber AND
        tlr.sonumber = so.sonumber AND
        so.status ='Open'AND 
        so.Status = sol.Status AND
        tlr.SOLineNumber = sol.SOLineNumber

DISTINCT
将返回所有不同的、唯一的行。由于所有行都是唯一的(从您的示例来看,这似乎是唯一的),因此将返回所有行。这将执行与按此处所有列分组相同的操作

内部连接
连接
是同一件事。如果您是SQL新手,那么值得一读连接

您可能需要的是
MIN()。这将仅返回具有最小solinenumber的行:

Select  so.sonumber, 
        MIN(sol.SOLineNumber)

From    tblsoso so, 
        tblsoSOLine sol,
        tblsosolinerep tlr

where   so.SONumber = '00316510' AND
        sol.SONumber = so.SONumber AND
        tlr.sonumber = so.sonumber AND
        so.status ='Open'AND 
        so.Status = sol.Status AND
        tlr.SOLineNumber = sol.SOLineNumber

GROUP BY so.sonumber
尽管您应该像这样使用显式连接语法:

SELECT     so.sonumber, 
           MIN(sol.SOLineNumber)

FROM       tblsoso so
INNER JOIN tblsoSOLine sol ON  sol.SONumber = so.SONumber 
                           AND so.Status = sol.Status
INNER JOIN tblsosolinerep tlr ON  tlr.sonumber = so.sonumber 
                              AND tlr.SOLineNumber = sol.SOLineNumber

WHERE      so.SONumber = '00316510'
AND        so.status ='Open'

GROUP BY   so.sonumber

这是标准语法,更易于阅读。特别是当您开始使用不同的联接或大量联接时。

DISTINCT
将返回所有不同的、唯一的行。由于所有行都是唯一的(从您的示例来看,这似乎是唯一的),因此将返回所有行。这将执行与按此处所有列分组相同的操作

内部连接
连接
是同一件事。如果您是SQL新手,那么值得一读连接

您可能需要的是
MIN()。这将仅返回具有最小solinenumber的行:

Select  so.sonumber, 
        MIN(sol.SOLineNumber)

From    tblsoso so, 
        tblsoSOLine sol,
        tblsosolinerep tlr

where   so.SONumber = '00316510' AND
        sol.SONumber = so.SONumber AND
        tlr.sonumber = so.sonumber AND
        so.status ='Open'AND 
        so.Status = sol.Status AND
        tlr.SOLineNumber = sol.SOLineNumber

GROUP BY so.sonumber
尽管您应该像这样使用显式连接语法:

SELECT     so.sonumber, 
           MIN(sol.SOLineNumber)

FROM       tblsoso so
INNER JOIN tblsoSOLine sol ON  sol.SONumber = so.SONumber 
                           AND so.Status = sol.Status
INNER JOIN tblsosolinerep tlr ON  tlr.sonumber = so.sonumber 
                              AND tlr.SOLineNumber = sol.SOLineNumber

WHERE      so.SONumber = '00316510'
AND        so.status ='Open'

GROUP BY   so.sonumber
这是标准语法,更易于阅读。尤其是当您开始使用不同的联接,或大量联接时。

未经测试

;with cteFirst as (
Select  so.sonumber, 
       ,sol.SOLineNumber
       ,RowNr=Row_Number() over (Partition By so.sonumber order by sol.SOLineNumber) 
From    tblsoso so, 
        tblsoSOLine sol,
        tblsosolinerep tlr

where   so.SONumber = '00316510' AND
        sol.SONumber = so.SONumber AND
        tlr.sonumber = so.sonumber AND
        so.status ='Open'AND 
        so.Status = sol.Status AND
        tlr.SOLineNumber = sol.SOLineNumber
    )
    Select * from cteFirst where RowNr=1
未经测试

;with cteFirst as (
Select  so.sonumber, 
       ,sol.SOLineNumber
       ,RowNr=Row_Number() over (Partition By so.sonumber order by sol.SOLineNumber) 
From    tblsoso so, 
        tblsoSOLine sol,
        tblsosolinerep tlr

where   so.SONumber = '00316510' AND
        sol.SONumber = so.SONumber AND
        tlr.sonumber = so.sonumber AND
        so.status ='Open'AND 
        so.Status = sol.Status AND
        tlr.SOLineNumber = sol.SOLineNumber
    )
    Select * from cteFirst where RowNr=1

为什么要使用隐式联接,而不是ANSI-92中的显式
JOIN
符号?您的示例表明
so
中的一行联接到
sol
中的多行。您想从
sol
中选择哪一行?您提到的“first”是指“solinenumber
中值最低的行”吗?如果是这样,使用
MIN(solinenumber)
是否足够,或者您是否还希望包含
sol
表中的其他字段?请阅读。为什么要使用隐式联接,相反,ANSI-92中明确的
JOIN
表示法?您的示例表明
so
中的一行连接到
sol
中的多行。您想从
sol
中选择哪一行?您提到的“first”是指“solinenumber中值最低的行”吗?如果是这样,使用
MIN(solinenumber)
是否足够,或者您是否还希望包含
sol
表中的其他字段?请阅读。我知道这一定是我缺少的简单内容。您关于MIN()和groupby的第一个示例正是我想要的。谢谢你的帮助@瑞克-说真的,使用第二个查询。您使用的语法在20多年前的1992年被替换,现在在许多系统上被弃用,因为它并不总是正确工作。更不用说它更难阅读和维护,更容易出错,而且,在我招聘时,任何使用这种语法的应聘者都会立即落后于使用
JOIN
s的应聘者。网上有很多(等等)阐述了类似的观点。我知道这一定是我错过的一些简单的东西。您关于MIN()和groupby的第一个示例正是我想要的。谢谢你的帮助@瑞克-说真的,使用第二个查询。您使用的语法在20多年前的1992年被替换,现在在许多系统上被弃用,因为它并不总是正确工作。更不用说它更难阅读和维护,更容易出错,而且,在我招聘时,任何使用这种语法的应聘者都会立即落后于使用
JOIN
s的应聘者。网上有很多类似的观点。