在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的应聘者。网上有很多类似的观点。