如何在 SQL 中抑制或隐藏重复值?

问题描述 投票:0回答:1

我已经四处寻找了一下,但还没有找到如何做到这一点(尽管已经找到了很多关于分析其性能的信息?!)

我想执行一个选择,返回几列数据,然后还返回另一个表中相关行的嵌套表(实际上是同一个表本身连接,但我“认为”这是不相关的)。

所以数据是这样的:

id  name   registered
1   Dan      N
2   Bill     N
3   Bob      N
4   Dan      N
5   Bill     Y
6   Dan      Y

这个想法是执行一个选择,找到所有可能与注册帐户相关的未注册人员。

所以结果看起来像这样

registered.id   name   notreg.id   name
  5             Bill     2          Bill
  6             Dan      1          Dan
                         4          Dan

我可以使用 SQL 处理所有选择条件等,并且有一个查询返回找到此内容的正常内部联接,但想知道是否有可能获得类似这样的结果集,因此在左边??

sql select
1个回答
9
投票

您最好在客户端中抑制重复项(例如在 Jasper Reports 中取消选中

Print Repeated Value
或在 XML 集中
isPrintRepeatedValues="false"

但是,在任何支持

WITH
(CTE) 和
ROW_NUMBER()
的设备上(例如 Oracle、SQL Server 2005+)。

WITH ns 
         AS (SELECT ROW_NUMBER() OVER (PARTITION BY name ORDER BY id) rn, 
                    id, 
                    name, 
                    registered 
             FROM   t 
             WHERE  registered = 'N') 
    SELECT t.id, 
           t.name, 
           ns.id, 
           ns.name 
    FROM   ns 
           LEFT JOIN t 
             ON ns.name = t.name 
                AND t.registered = 'Y' 
                AND ns.rn = 1 
    WHERE  ns.name IN (SELECT name 
                       FROM   t 
                       WHERE  registered = 'Y')  
    
    ORDER  BY ns.name 

参见工作示例

如果您没有WITH和ROW_NUMBER,您可以这样做

SELECT t.id, 
       t.name, 
       ns.id, 
       ns.name 
FROM   t ns 
       LEFT JOIN (SELECT MIN(id) id, 
                         name 
                  FROM   t 
                  WHERE  registered = 'N' 
                  GROUP  BY name) MINNS 
         ON ns.id = MINNS.id 
       LEFT JOIN t 
         ON ns.name = t.name 
            AND t.registered = 'Y' 
            AND MINNS.id IS NOT NULL 
WHERE  ns.registered = 'N' 
       AND ns.name IN (SELECT name 
                       FROM   t 
                       WHERE  registered = 'Y') 
ORDER  BY ns.name, 
          ns.id

参见工作示例

© www.soinside.com 2019 - 2024. All rights reserved.