【问题标题】:How to rewrite a subquery to use joins when you used DISTINCT in the subquery?在子查询中使用 DISTINCT 时如何重写子查询以使用联接?
【发布时间】:2010-10-07 05:58:59
【问题描述】:

我有一个使用子查询的查询,我想重写为一个连接,以获得更好的性能。

子查询使用 DISTINCT 因为有很多记录,我遇到的问题是当我使用连接时它们在连接中多次结束。

那么我该如何重写这样的查询以使用连接:

SELECT * 
FROM   table1 a 
       JOIN table2 b 
         ON b.field1 = a.field1 
WHERE  b.field3 = 1531 
       AND a.field4 = 0 
       AND a.field5 IN (SELECT DISTINCT field5 
                        FROM   table3 
                        WHERE  field6 = 172) 

【问题讨论】:

    标签: sql mysql join subquery


    【解决方案1】:

    类似:

    SELECT * 
    FROM   table1 a 
           JOIN table2 b ON b.field1 = a.field1 
           JOIN ( SELECT DISTINCT field5 
                            FROM   table3 
                            WHERE  field6 = 172 ) C 
           ON C.field5 = a.field5
    
    WHERE  b.field3 = 1531 AND a.field4 = 0 
    

    没有看到实际数据很难说,所以如果这不起作用,请告诉我。

    【讨论】:

    • @Srinivas - 如果您询问这是否合法语法,是的,您可以加入另一个选择查询的结果,就好像它是一个表一样。不确定这是否是 ANSI-92;我正在查看我自己的 MS SQL Server 代码。
    • 查询是正确的,JOIN后有个表,用()括起来,是子查询,计算表。
    【解决方案2】:

    DISTINCT 关键字重新定位到主查询中的 SELECT 子句,例如

    SELECT DISTINCT a.*, b.*
    FROM   table1 a 
           JOIN table2 b 
             ON b.field1 = a.field1 
           JOIN table3 c
             ON a.field5 = c.field5 
    WHERE  b.field3 = 1531 
           AND a.field4 = 0 
           AND c.field6 = 172;
    

    您应该在查询中查看SELECT * 的使用情况,即不是最佳做法。

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 2011-04-30
      • 2020-12-29
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多