0

我在 sql server 中有子表(位置 x,位置 y)和父表(位置 x,位置 y)。我想要的是找到最接近每个孩子的父母。我可以做到“不好的方式”,但可能有一个不使用任何循环的解决方案。

那是我的代码:

SELECT 
    child.idChild, child.x, child.y, 
    parent.idParent, parent.x, parent.y,
    sqrt(power(child.x - parent.x, 2) + power(child.y - parent.y, 2)) as distance
FROM 
    child
CROSS JOIN 
    parent
ORDER BY 
    idChild, distance

好的,没关系。但是现在我想将父母限制为每个孩子的TOP1。

谢谢

4

1 回答 1

1

一个方便的方法是使用窗口函数。要获得第一行,您可以使用row_number()rank()。有联系时有区别。 row_number()仅返回多个值之一。 rank()将返回所有这些。

这是编写查询的一种方法:

select idChild, x, y, idParent, parentx, parenty
from (SELECT child.idChild, child.x, child.y, 
             parent.idParent, parent.x as parentx, parent.y as parenty,
             ROW_NUMBER() over (partition by child.idchild
                                order by power(child.x - parent.x, 2) + power(child.y - parent.y, 2)
                               ) as seqnum
      FROM child CROSS JOIN 
           parent
     ) pc
where seqnum = 1;

sqrt()从距离函数中删除了 ,因为在寻找最小数字时没有必要。

于 2013-05-29T18:28:48.747 回答