如何编写此SQL查询?

如何编写此SQL查询?,sql,Sql,我有一个表,记录链接到父项的子项的历史记录,有两列: 父ID 孩子气的 一些示例数据如下所示: ParentId-ChildId 001 - 001 001 - 001 001 - 001 001 - 002 001 - 002 001 - 002 001 - 003 001 - 003 001 - 003 001 - 003 001 - 004 001 - 004 001

我有一个表,记录链接到父项的子项的历史记录,有两列:

父ID 孩子气的 一些示例数据如下所示:

ParentId-ChildId 001 - 001 001 - 001 001 - 001 001 - 002 001 - 002 001 - 002 001 - 003 001 - 003 001 - 003 001 - 003 001 - 004 001 - 004 001 - 005 001 - 005 001 - 005 001-005

我需要为给定的ParentId选择具有最高值ChildId的所有行。因此,在上面的示例中,我需要查询返回以下行,给定输入参数“@parentId=001”:

001-005 001 - 005 001 - 005 001-005

谢谢你的帮助

这个怎么样

SELECT ParentID, MAX(ChildID) AS ChildID
FROM TableName
GROUP BY ParentID
更新以编辑遗漏的要求以返回所有行:

测试数据

结果

注意:根据使用WHERE子句中的以下语句的SQL Server profiler,此解决方案的性能与接受的解决方案相同。但我更喜欢我的解决方案,因为它对我来说更干净,并且可以很容易地扩展到包括其他需要的parentID。例如,报告目的

(SELECT MAX(childId) FROM #table WHERE parentId = @ParentID)
这个怎么样

SELECT ParentID, MAX(ChildID) AS ChildID
FROM TableName
GROUP BY ParentID
更新以编辑遗漏的要求以返回所有行:

测试数据

结果

注意:根据使用WHERE子句中的以下语句的SQL Server profiler,此解决方案的性能与接受的解决方案相同。但我更喜欢我的解决方案,因为它对我来说更干净,并且可以很容易地扩展到包括其他需要的parentID。例如,报告目的

(SELECT MAX(childId) FROM #table WHERE parentId = @ParentID)
这是不可能做到的:

SELECT * FROM MyTable
WHERE parentId = '001'
AND childId = (SELECT MAX(childId) FROM MyTable WHERE parentId = '001')
这是不可能做到的:

SELECT * FROM MyTable
WHERE parentId = '001'
AND childId = (SELECT MAX(childId) FROM MyTable WHERE parentId = '001')

为了满足表中多个家长的需要,以下内容应该有所帮助

select parentId, max(childid) as ChildId
from <table_name>
group by parentId

为了满足表中多个家长的需要,以下内容应该有所帮助

select parentId, max(childid) as ChildId
from <table_name>
group by parentId
选择* 从表\u名称 其中ParentId=@ParentId 按父ID分组 让ChildId=MAXChildId

选择* 从表\u名称 其中ParentId=@ParentId 按父ID分组

HAVING ChildId=MAXChildId

到目前为止您尝试了什么?堆栈溢出不是为了帮你完成工作,而是为了帮助你完成工作。我意识到了这一点,我在下午的大部分时间里都在尝试!我猜它需要一个带有order by和select top 1的嵌套查询,但我似乎无法获得正确的语法。为什么id 001是它自己的父项,3次?这不会引起循环吗?在001下面,你也有001,在它下面有一个001,然后在它下面有一个001,而且…?因为关系实际上有点复杂-父母->孩子->孙子。我知道桌子可以而且应该设计得更好,但我没有建立这个系统,也没有改变它们的奢侈:到目前为止你试过什么?堆栈溢出不是为了帮你完成工作,而是为了帮助你完成工作。我意识到了这一点,我在下午的大部分时间里都在尝试!我猜它需要一个带有order by和select top 1的嵌套查询,但我似乎无法获得正确的语法。为什么id 001是它自己的父项,3次?这不会引起循环吗?在001下面,你也有001,在它下面有一个001,然后在它下面有一个001,而且…?因为关系实际上有点复杂-父母->孩子->孙子。我知道桌子可以而且应该设计得更好,但是我没有建立系统,也没有改变它们的奢侈:问题是当有多个不同的parentId时。@dar7yl-分组解决方案的问题是,正如MalcomTucker提到的,它只返回一行,而不是他想要的所有匹配行。@Matthew Jones-是的,这只适用于一个父id,但这正是他想要的。问题是当存在多个不同的父id时。@dar7yl-group by解决方案的问题是,正如MalcomTucker提到的,它只返回一行,而不是他想要的所有匹配行。@Matthew Jones-是的,这只适用于一个父id,但这正是他想要的。这和beach的答案是更好的解决方案。Break使用表联接提供的解决方案如何优于更简单的GROUP by语句?这和beach的答案是更好的解决方案。Break使用表联接提供的解决方案如何优于GROUP by语句更简单的分组陈述?@daryl:这不是正确的答案。这个答案只返回一行。OP希望返回符合此条件的每一行。@eric-啊,你说得对。但是,对原始表的简单连接使用ParentID和ChildID作为键返回正确的数据。使用此方法,您不仅可以查看“001”,还可以获取所有parentId的最大值。如果SELECT MAX子查询与主表相关联,则所选答案将得到更好的增强,从而扩展了解决方案的实用性。@daryl:这根本不是正确的答案。这个答案只返回一个ro
WOP希望返回符合此条件的每一行。@eric-啊,你说得对。但是,对原始表的简单连接使用ParentID和ChildID作为键返回正确的数据。使用此方法,您不仅可以查看“001”,还可以获取所有parentId的最大值。如果SELECT MAX子查询与主表关联,则所选答案将得到更好的增强,从而扩展解决方案的有用性。