代码之家  ›  专栏  ›  技术社区  ›  Harsh Shankar

在联接之后是DISTINCT或使用DISTINCT然后是JOIN的子查询

  •  0
  • Harsh Shankar  · 技术社区  · 6 年前

    在写程序的时候,我遇到了一个情况,我必须 DISTINCT 在查询中。这有点类似于我的表模式

    CREATE TABLE T1
    (
         ID         INT,
         TypeID     INT,
         SubTypeID  INT,
         Name       VARCHAR(50)
    );
    GO
    
    CREATE TABLE T2
    (
         TypeID     INT,
         SubTypeID  INT,
         TypeName   VARCHAR(50)
    );
    GO
    
    INSERT INTO T2 (TypeID, SubTypeID, TypeName)
    VALUES (1, 1, 'AAA'), (1, 2, 'AAA'),
           (2, 1, 'BBB'), (2, 2, 'BBB'),
           (3, 1, 'CCC'), (3, 2, 'CCC');
    
    INSERT INTO T1 (ID, TypeID, SubTypeID, Name)
    VALUES (1, 1, 1, 'ABC'), (2, 2, 2, 'BCD'),
           (3, 3, 2, 'CDE'), (4, 1, 1, 'DEF'),
           (5, 2, 2, 'EFG'), (6, 3, 0, 'FGH');    -- Sub Type not detected yet.
    GO
    

    在这种情况下,任何一个用户都可以提供 SubType 或者让系统来检测。

    现在我有两个查询选项。

    选择1

    SELECT DISTINCT t1.ID, t1.Name, t2.TypeName
    FROM T1
    JOIN T2 ON T1.TypeID = T2.TypeID;
    

    和方案2

    SELECT t1.ID, t1.Name, t2.TypeName
    FROM T1
    JOIN (SELECT DISTINCT  TypeID, TypeName FROM T2) AS T2 ON T1.TypeID = T2.TypeID;
    

    这两种情况下的结果都是一样的,但我想知道哪一种更可取。表T1中可能有数百万行,T2中可能有数千行。

    在我看来,我应该使用第一个选项来避免子查询。

    但仍想与社会确认,因为它可能会有一些或主要的性能影响,这还不知道。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gordon Linoff    6 年前

    如果你在乎表现,就避免 select distinct 在外部查询中。我想试试这个:

    SELECT t1.ID, t1.Name, t2.TypeName
    FROM T1 CROSS APPLY
         (SELECT DISTINCT T2.TypeName
          FROM T2
          WHERE T1.TypeID = T2.TypeID
         ) T2;
    
    推荐文章