INNER JOIN vs IN

Max*_*ich 2 sql t-sql syntax performance

SELECT C.* FROM StockToCategory STC 
INNER JOIN Category C ON STC.CategoryID = C.CategoryID 
WHERE STC.StockID = @StockID
Run Code Online (Sandbox Code Playgroud)

VS

SELECT * FROM Category
WHERE CategoryID IN
    (SELECT CategoryID FROM StockToCategory WHERE StockID = @StockID)
Run Code Online (Sandbox Code Playgroud)

这被认为是正确的(语法上)和最高效的方法,为什么?

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

我查看了查询计划,但无法从中解析任何内容.

查询计划1
查询计划2

Tho*_*mas 10

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

使用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
                )
Run Code Online (Sandbox Code Playgroud)

  • +1表示JOIN可能重复类别行,*这是*这些查询之间的真正区别. (3认同)