1

私はこの問題を骨の折れる部分から取り除こうとしました。元のクエリで達成しようとしていることの本質をまだ把握していることを願っています。

  • テーブルとデータを生成するためのコードはここにあります。
  • SQLフレーバーはMicrosoftSQLServer 2000です(ただし、MySQLでこの簡略化されたテストケースを実行しています)

元のテーブル

+-----------+----------+----------+
| master_id | slave_id | distance |
+-----------+----------+----------+
|         1 |        1 | 0.1      |
|         1 |        3 | 10       |
|         2 |        2 | 3        |
|         3 |        2 | 2        |
+-----------+----------+----------+

必要なものの説明

またはの重複がないペアslave_id master_idを選択したいと思います。MIN(distance)master_idslave_id

望ましい結果表

+-----------+----------+----------+
| master_id | slave_id | distance |
+-----------+----------+----------+
|         1 |        1 | 0.1      |
|         3 |        2 | 2        |
+-----------+----------+----------+

私の試み

SELECT
        join_table.master_id,
        join_table.slave_id,
        join_table.distance
    FROM join_table
    INNER JOIN
        (
            SELECT
                slave_id,
                MIN(distance) AS distance
            FROM join_table
            GROUP BY slave_id
        ) AS self_join
    ON self_join.slave_id = join_table.slave_id
    AND self_join.distance = join_table.distance

私の試みの何が問題になっていますか

このクエリは、の重複を生成しますmaster_id

どんな助けでも大歓迎です。

4

2 に答える 2

3

これにより、正しい結果が得られるはずです。

select distinct t.master_id,
  t.slave_id,
  t.distance
from join_table t
inner join
(
  SELECT ID, min(Distance) dist
  FROM 
  (
    SELECT master_ID ID, MIN(distance) AS Distance
    FROM join_table
    GROUP BY master_ID
    UNION
    SELECT slave_ID ID, MIN(distance) AS Distance
    FROM join_table
    GROUP BY slave_ID
  ) src
  GROUP BY ID
) md
  on t.distance = md.dist
  and (t.master_id = md.id or t.slave_id = md.id)

SQL FiddlewithDemoを参照してください

于 2013-02-26T03:58:15.997 に答える
0

私があなたを正しく理解した場合、これが私がすることです:

SELECT DISTINCT t.master_id
   ,t.slave_id
   ,t.distance
FROM your_table t
   INNER JOIN 
   (
      SELECT master_id id, min(distance) distance
      FROM your_table
      GROUP BY master_id

      UNION

      SELECT slave_id id, min(distance) distance
      FROM your_table
      GROUP BY slave_id

   ) sub
   ON (sub.id = t.master_id AND sub.distance = t.distance)
     OR (sub.id = t.slave_id AND sub.distance = t.distance)
于 2013-02-26T03:38:52.107 に答える