Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在两列(分别)上显示Distinct,在另一列上显示MIN_Sql_Sql Server_Tsql_Distinct - Fatal编程技术网

Sql 在两列(分别)上显示Distinct,在另一列上显示MIN

Sql 在两列(分别)上显示Distinct,在另一列上显示MIN,sql,sql-server,tsql,distinct,Sql,Sql Server,Tsql,Distinct,我已经试着把这个问题一笔勾销了;我希望我仍然抓住了我试图在原始查询中实现的本质 可以找到生成表和数据的代码 SQL风格是Microsoft SQL Server 2000(尽管我一直在MySQL上运行这个精简的测试用例) 原始表格 +-----------+----------+----------+ | master_id | slave_id | distance | +-----------+----------+----------+ | 1 | 1 |

我已经试着把这个问题一笔勾销了;我希望我仍然抓住了我试图在原始查询中实现的本质

  • 可以找到生成表和数据的代码
  • SQL风格是Microsoft SQL Server 2000(尽管我一直在MySQL上运行这个精简的测试用例)
原始表格

+-----------+----------+----------+
| master_id | slave_id | distance |
+-----------+----------+----------+
|         1 |        1 | 0.1      |
|         1 |        3 | 10       |
|         2 |        2 | 3        |
|         3 |        2 | 2        |
+-----------+----------+----------+
+-----------+----------+----------+
| master_id | slave_id | distance |
+-----------+----------+----------+
|         1 |        1 | 0.1      |
|         3 |        2 | 2        |
+-----------+----------+----------+
所需内容的说明

我想选择
slave\u id
master\u id
配对
MIN(distance)
,不重复
master\u id
slave\u id

所需结果表

+-----------+----------+----------+
| master_id | slave_id | distance |
+-----------+----------+----------+
|         1 |        1 | 0.1      |
|         1 |        3 | 10       |
|         2 |        2 | 3        |
|         3 |        2 | 2        |
+-----------+----------+----------+
+-----------+----------+----------+
| 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
我的尝试有什么问题

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\u id


非常感谢您的帮助。

如果我没弄错,我会做以下几点:

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)

这将给出正确的结果:

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)

参见

如何筛选出
主id
2而不是
主id
3?什么是“主id或从id都不重复”?什么违反了这一要求?@MattBusche的最小距离(distance)requirement@bluefeet抱歉-我已经添加了我的attempt@rgvcorley . . . 这看起来更像是一个优化问题,而不是一个查询问题。当两个具有相同id的行具有相同的最小值时会发生什么情况?请注意,但看起来我必须找到一种方法来获取表的本地副本以运行查询-所讨论的表具有>1亿条记录,并且没有关于距离的索引。。。不用说3小时的查询时间限制是不够的。。。