繁体   English   中英

从SQL查询中删除重复项

[英]Removing duplicates from SQL query

我正在尝试创建一个SQL查询,该查询将不返回具有相同ID的行。 我还想指定一个主行,以便在两行具有相同ID的情况下,将返回主行。 如果未指定主行,我想返回第一行。

这是我要查询的数据库示例。

+----+---------+-------+
| id | primary | label |
+----+---------+-------+
| 1  |    Y    |   A   |
| 1  |         |   B   |  
| 2  |         |   C   |
| 2  |         |   D   |
| 3  |         |   E   |
+----+---------+-------+

这是我要达到的结果的一个示例

+----+---------+-------+
| id | primary | label |
+----+---------+-------+
| 1  |    Y    |   A   |
| 2  |         |   C   |
| 3  |         |   E   |
+----+---------+-------+

我一直在尝试使用select different,但是对于解决此问题的方向我不确定。 任何帮助是极大的赞赏。 谢谢!

在您的情况下,子查询比DISTINCT更合适。

请尝试以下。 这是获得所需结果的演示: http : //sqlfiddle.com/#!2/97fdd3/1/0

顺便说一下,当ID没有“主要”时,这将为该ID选择最低的标签值。 正如其他人所说,这比“数据库中的顺序”更可靠。

select *
  from tbl t
 where t.label = (select x.label
                    from tbl x
                   where x.primary = 'Y'
                     and x.id = t.id)
    or (not exists
        (select 1
           from tbl x
          where x.primary = 'Y'
            and x.id = t.id) and
        t.label = (select min(x.label) from tbl x where x.id = t.id))

我可以看到您已经有了答案,但是您也可以使用常规的LEFT JOIN ;

SELECT * FROM mytable a 
LEFT JOIN mytable b
  ON a.id = b.id AND (
            a.label>b.label AND a.primary IS NULL AND b.primary IS NULL OR 
                                a.primary IS NULL AND b.primary='Y')
WHERE b.id IS NULL

要使用进行测试的SQLfiddle

SELECT a.id, 
       IFNULL(primaries.primary, '') AS primary, 
       IFNULL(primaries.label, secondary.label) AS label
FROM yourTable AS a
LEFT JOIN (SELECT *
           FROM yourTable
           WHERE primary = 'Y') AS primaries
ON a.id = primaries.id AND a.label = primaries.label
LEFT JOIN (SELECT id, MIN(label) AS label
           FROM yourTable
           WHERE primary != 'Y'
           GROUP BY id) AS secondary
ON a.id = secondary.id AND a.label = secondary.label

也许像这样的作品(未经测试):

SELECT DISTINCT
      t1.id
     ,t2.primary
     ,t2.label
FROM table t1
    LEFT JOIN (
        SELECT id, primary, label
        FROM table
        GROUP BY id
        ORDER BY primary DESC, label ASC
        LIMIT 1
    ) t2 ON t2.id=t1.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM