将嵌套的sql转换为联接模式

Pet*_*Unn 5 sql database sql-server join

我有一个查询返回正确的数据给我,但作为开发人员而不是DBA我想知道是否有任何理由将其转换为连接而不是嵌套选择,如果是这样,它会是什么样子.

我的代码目前是

select * from adjustments where store_id in (
    select id from stores where original_id = (
        select original_id from stores where name ='abcd'))
Run Code Online (Sandbox Code Playgroud)

任何对更好地使用连接的引用也会受到赞赏.

Lie*_*ers 5

除了可能的性能改进之外,我发现以下内容更容易阅读.

SELECT  * 
FROM    adjustments a
        INNER JOIN stores s ON s.id = a.store_id
        INNER JOIN stores s2 ON s2.original_id = s.original_id
WHERE   s.name = 'abcd'        
Run Code Online (Sandbox Code Playgroud)

测试脚本在省略original_id时显示我的原始错误

DECLARE @Adjustments TABLE (store_id INTEGER)
DECLARE @Stores TABLE (id INTEGER, name VARCHAR(32), original_id INTEGER)

INSERT INTO @Adjustments VALUES (1), (2), (3)
INSERT INTO @Stores VALUES (1, 'abcd', 1), (2, '2', 1), (3, '3', 1)

/* 
   OP's Original statement returns store_id's 1, 2 & 3 
   due to original_id being all the same
*/
SELECT  * FROM @Adjustments WHERE store_id IN (
  SELECT id FROM @Stores WHERE original_id = (
    SELECT original_id FROM @Stores WHERE name ='abcd'))

/* 
   Faulty first attempt with removing original_id from the equation
   only returns store_id 1
*/
SELECT  a.store_id
FROM    @Adjustments a
        INNER JOIN @Stores s ON s.id = a.store_id
WHERE   s.name = 'abcd'        
Run Code Online (Sandbox Code Playgroud)

  • @Lieven - 你应该保留这个答案,并更清楚地说明为什么你不能用简单的连接来替换原始查询. (2认同)