CROSS JOIN中的TOP1(SQL SERVER)

时间:2013-05-29 18:23:33

标签: sql sql-server

我在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。

由于

1 个答案:

答案 0 :(得分: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(),因为在查找最小数字时没有必要。