【问题标题】:Tuning a query converting subquery调整查询转换子查询
【发布时间】:2020-02-03 02:36:14
【问题描述】:

我试图将 WHERE 子句中有子查询的更新语句更改为连接以提高性能。 DDL 到样本表/数据

CREATE TABLE [dbo].[Table1](
[pre_plan_id] [smallint] NULL,
[pre_type_id] [smallint] NULL,
[associate_id] [smallint] NOT NULL,
[deleted] [bit] NOT NULL
)  

INSERT INTO Table1 
VALUES 
(NULL,  NULL,   -32768, 0),
(1,  NULL,   2,  1),
(1,  NULL,   3,  0), 
(NULL, NULL, 3109, 0), 
(1, NULL, 3109, 1) 

CREATE TABLE [dbo].[Table2](
[type_id] [smallint] NOT NULL,
[plan_id] [smallint] NOT NULL,
[associate_id] [smallint] NOT NULL,
[time_in] [smalldatetime] NOT NULL
) 
INSERT INTO Table2 
VALUES
(390,   31, 3109,   '2009-09-02'),
(304,   32, 3109,   '2010-02-05'),
(388,   31, 3109,   '2010-09-24') 

使用子查询的查询:

SELECT pre_plan_id, pre_type_id FROM Table1  WHERE pre_plan_id =1 
AND associate_id  NOT IN 
(SELECT TOP 2 associate_id 
FROM Table2 WHERE time_in= '2010-09-24 00:00:00' group by associate_id order by count(*) desc) 

我尝试将其转换为 JOIN

SELECT pre_plan_id 
FROM (SELECT pre_plan_id, pre_type_id, rn
FROM Table1 a  
LEFT JOIN 
( select associate_id, Row_number() over (partition by associate_id order by count(*) desc ) rn 
FROM Table2 
WHERE time_in= '2010-09-24 00:00:00' Group by associate_id) b 
ON a.associate_id = b.associate_id where b.rn <> 1) a
where pre_plan_id = 1  

但是,当我期望有两行时,这什么也没显示;这是因为 b.rn 1 我希望它在 b.rn 1

时会显示 NULL 值

对此有何解释?任何有关调整查询的更好方法的指南都非常感谢。

谢谢。

【问题讨论】:

    标签: sql tsql join subquery


    【解决方案1】:

    您可以将子查询移至FROM 子句并使用LEFT JOIN

    SELECT t1.pre_plan_id, t1.pre_type_id
    FROM Table1 t1 LEFT JOIN
         (SELECT TOP 2 t2.associate_id 
          FROM Table2
          WHERE t2.time_in= '2010-09-24 00:00:00' 
          GROUP BY associate_id 
          ORDER BY COUNT(*) DESC
         ) t2
         ON t2.associate_id = t1.associate_id
    WHERE t1.pre_plan_id = 1 AND t2.associate_id IS NULL;
    

    【讨论】:

      猜你喜欢
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      相关资源
      最近更新 更多