一尘不染

内联vs内

sql

SELECT C.* FROM StockToCategory STC 
INNER JOIN Category C ON STC.CategoryID = C.CategoryID 
WHERE STC.StockID = @StockID

VS

SELECT * FROM Category
WHERE CategoryID IN
    (SELECT CategoryID FROM StockToCategory WHERE StockID = @StockID)

哪种被认为是 正确的 (语法上)且性能最高的方法,为什么?

后一个示例中的语法对我来说似乎更合乎逻辑,但我的假设是JOIN会更快。

我看过查询计划,还无法从中解密任何内容。

查询计划1
查询计划2


阅读 138

收藏
2021-03-08

共1个答案

一尘不染

两种语法有不同的用途。假设使用Join语法,则需要StockToCategory和Category表中的某些内容。如果每个类别的StockToCategory表中有多个条目,则将重复“类别”表的值。

使用IN函数可以假定您只需要类别中ID符合某些条件的项目。如果给定的CategoryId(假设它是Category表的PK)在StockToCategory表中多次存在,则仅返回一次。

在您的确切示例中,它们将产生相同的输出,但是IMO,后面的语法使您的意图(仅想要类别)更加清晰。

顺便说一句,第三种语法类似于使用IN函数:

Select ...
From Category
Where Exists    (
                Select 1
                From StockToCategory
                Where StockToCategory.CategoryId = Category.CategoryId
                    And StockToCategory.Stock = @StockId
                )
2021-03-08