0

SQLサーバーに子(位置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()複数の値の 1 つだけを返します。 rank()それらすべてを返します。

クエリを記述する 1 つの方法を次に示します。

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()最小数を探す場合は必要ないため、from the distance 関数を削除しました。

于 2013-05-29T18:28:48.747 に答える