sql - 内连接 vs 内连接

标签 sql performance tsql syntax

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 会更快。

我查看了查询计划,但无法从中破译任何内容。

Query Plan 1
Query Plan 2

最佳答案

这两种语法用于不同的目的。使用 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
                )

关于sql - 内连接 vs 内连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4755616/

相关文章:

mysql - 如果mysql中的数据发生更改,如何删除旧条目同时插入新条目

mysql - SQL - 从链接表中选择 first_table_id,其中第二个表中的所有记录都是指定类型

java - 如何增加WildFly的堆内存?

macos - 查询图形功能以决定是否应用 GPU 密集型效果(通过 SpriteKit)

c++ - 使用相同输入连续调用 ID3D11DeviceContext 状态的成本?

sql - 找出 SQL Server 上的查询中获取了哪些锁?

java - 从远程服务恢复的 ListView 和大型列表

sql - 在 Access 查询中生成运行总和时遇到问题

tsql - T-Sql 如何从另一个存储过程中的存储过程返回表

SQL:如何通过某些列的值将表中的 'split' 行?