【问题标题】:How to get same results without using distinct in query如何在不使用 distinct 在查询中获得相同的结果
【发布时间】:2011-08-16 20:23:49
【问题描述】:

我有一个表格,里面有这样的数据:

[ID, Name]
1, Bob
1, Joe
1, Joe
1, Bob

我想检索显示具有相同 ID 的记录之间关系的记录列表。 例如,我想从我的查询中得到以下结果集:

Bob, Joe
Joe, Bob
Bob, Bob
Joe, Joe

这显示了表格中每个项目的“从”和“到”。

我可以使用以下查询得到这个结果:

SELECT DISTINCT [NAME] 
FROM TABLE A
INNER JOIN TABLE B ON A.ID = B.ID

无论如何,我是否可以在不使用 select 语句中的“distinct”的情况下获得相同的结果集?如果我不包括不同的,我会返回 16 条记录,而不是 4 条。

【问题讨论】:

  • 不应该使用 DISTINCT 的任何特殊原因?
  • 这是一个问题,我遇到了一个更大的查询,需要超过 2.5 分钟才能运行。我正在尝试摆脱该查询上不同的外部级别,希望它能提高性能,这只是这个概念的一个简单说明。
  • 为了让我们清楚,您能否发布查询中提到的表 A/B 的架构/示例数据?
  • 嗯,对于这里的示例,架构和示例数据与我在上面发布的完全一样。两列,一列叫ID,一列叫“姓名”,数据如上图。
  • 对,但在我看来,您要么将表连接到自身,要么有两个表(在本例中)具有相同的架构,我只是想看看它是哪一个。

标签: sql distinct


【解决方案1】:

在没有 DISTINCT 的情况下获得重复行的原因是因为 ID = x 的每一行都将与 ID = x 的每一行连接。由于原始表有两次 (1, "Bob"),因此这两个表都将连接到 ID = 1 的另一个表中的每一行。

在进行连接之前删除重复项将做两件事:减少运行查询的时间,并防止重复的行出现在结果中。

类似(使用 MySQL 版本的 SQL):

SELECT L.NAME, R.NAME
FROM (SELECT DISTINCT ID, NAME FROM A) AS L
INNER JOIN (SELECT DISTINCT ID, NAME FROM B) AS R
ON L.ID = R.ID

编辑:B 是表 A 的别名吗?

【讨论】:

  • 我能够使用它来实现小的性能提升。谢谢。
【解决方案2】:

在 SQL 和 MY SQL 中

SELECT COLUMN_NAME FROM TABLE_NAME group by COLUMN_NAME

【讨论】:

    【解决方案3】:

    您是否尝试过使用group by 子句?

    select name
    from table a
    inner join table b
    on a.id=b.id
    group by name
    

    这应该会得到与上面的distinct 查询相同的结果。至于你想要的结果集,一个简单的自连接就可以了:

    select name1,name2
    from(
      select id,name as name1
      from table
      group by 1,2
      )a
    join(
      select id,name as name2
      from table
      group by 1,2
      )b
    using(id)
    

    【讨论】:

      【解决方案4】:

      用 union 消除重复值而不使用 distinct

      Declare @TableWithDuplicateValue Table(Name Varchar(255))
      Insert Into @TableWithDuplicateValue Values('Cat'),('Dog'),('Cat'),('Dog'),('Lion')
      
      Select Name From @TableWithDuplicateValue
      
      union
      
      select null where 1=0
      
      Go
      
      Output
      ---------
      Cat
      Dog
      Lion
      

      更多替代品请访问我的博客

      http://www.w3hattrick.com/2016/05/getting-distinct-rows-or-value-using.html

      【讨论】:

      • 请提供您提出的解决方案背后的背景信息,而不是链接到您自己的网站。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多