【问题标题】:Best approach to SQL Server query using distinct使用 distinct 进行 SQL Server 查询的最佳方法
【发布时间】:2010-09-30 11:08:28
【问题描述】:

我有两个表:TableA 和 TableB,由 TableA.TableA_Id->1..n

在给定 TableB 的特定条件下,我需要提取 distinct TableA 记录。这是我的第一种方法:

SELECT * FROM TableA A INNER JOIN TableB B ON A.idA = B.IdA AND B.Date = '2009-01-10' ORDER BY A.Id;

这很好,但它并没有给我“不同”的记录。表 B 上的某些记录可能是重复的,因此我可以多次获得相同的记录。

所以我决定执行一个子选择(性能不是问题,因为子选择可能会以最多 20/30 条记录结束):

SELECT * FROM TableA WHERE TableA.Id IN (SELECT DISTINCT IdA FROM TableB WHERE Date = '20090110') 按 TableA.IdA 排序;

这很好用。

现在的问题是:我怎样才能使用 Inner Join 并仍然获得不同的值?这是否可能一次性完成,或者嵌套查询是必须的?我错过了什么?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    使用派生表

    SELECT * FROM TableA 
    JOIN
    (SELECT DISTINCT IdA FROM TableB WHERE Date = '20090110') a
    ON a.IDA = TAbleA.IDA
    ORDER BY TableA.IdA
    

    【讨论】:

      【解决方案2】:

      我认为你需要一个正常的存在语句:

      SELECT * 
      FROM TableA A 
      WHERE Exists( select B.IdA from TableB B where A.IdA = B.IdA and B.Date = '2009-01-10' )
      ORDER BY A.Id;
      

      就性能而言,它应该是最好的方法。

      如果您需要其他表中的值,并且为了避免使用 distinct,您可以加入一个像这样分组的子查询:

      Select TableA.*, groupedTableB.OtherData 
      From TableA
      Inner join 
      (
          select TableB.IdA, Sum(TableB.Data) SummaryData
          from TableB where TableB.Date = '2009-01-10'
          group by TableB.IdA
      
      ) groupedTableB on groupedTableB.IdA = TableA.IdA
      

      【讨论】:

      • 只是让你知道,第二个不是子查询,它是一个派生表。
      • 感谢您的想法。也会试试这个
      【解决方案3】:

      以及使用问题

      SELECT DISTINCT * FROM TableA A INNER JOIN TableB B ON A.idA = B.IdA AND B.Date = '2009-01-10' ORDER BY A.Id;

      是吗?

      如果确实返回了重复的 idA 值,那是因为您选择的列太多,如果您无法减少选择的内容,则需要子查询。

      【讨论】:

      • 'Distinct ' 实际上是 '',如果没有完全重复的话。
      • 没错,我就是这么说的。
      • 特别是如果这些是大表,在连接之前限制来自 tableb 的记录的派生表方法可以节省时间。这是尝试它的原因之一。另外,由于您没有将列列表限制为表列,因此它仍然不会给出正确的答案。
      • 子查询将只返回 id,因此它是“DISTINCT IdA”。当然,除非所有记录都相同(事实并非如此),否则 Distinct * 可能会返回与 * 相同的结果。谢谢。
      【解决方案4】:

      这个怎么样:

      select * from TableA a 
        where a.TableA_Id in
      (select TableA_Id from TableB where [Date] = '2009-01-10')
      order by a.TableA_Id
      

      如果需要,您可以向子查询添加 distinct,我不确定这是否会提高或降低性能。

      【讨论】:

        猜你喜欢
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-14
        相关资源
        最近更新 更多