0

下面的代码片段应该做同样的工作。

SELECT t1.* FROM table1 t1
INNER JOIN table2 t2
ON t1.ID = t2.IDService
WHERE t2.Code = @code

SELECT * FROM table1 t1
WHERE t1.ID IN (SELECT IDService FROM table2 WHERE Code = @code)

一般来说,哪一个是最好的解决方案?并且在计算上,最好有两个嵌套选择还是更好地使用内连接?

编辑: 考虑到 table1 的IDPK 是和 table2 的 PK id 这对夫妇 ( IDService,Code)。因此,修复代码(usingWHERE子句)并将子句ON应用于 IDService,我可以假设每次选择的结果都是相同的。

4

2 回答 2

0

作为一个非常普遍的规则,JOIN几乎总是比SUB-QUERY执行得更好,但也有例外。

如果您要使用子查询,则EXIST子句在大多数用例中通常比IN执行得更好。

对于测试用例,您可以查看此站点

你应该遵循以下规则......

  1. 如果您需要来自多个表的数据,那么您始终可以使用联接。

  2. 如果您需要多个查询并且每个子查询提供查询中涉及的表的子集,则可以使用子查询。

  3. 如果查询需要 NOT EXISTS 条件,那么您必须使用子查询,因为 NOT EXISTS 仅在子查询中运行;同样的原则也适用于 EXISTS 条件。

  4. PROCEDURE SQL 查询优化器将一些子查询更改为连接,连接通常更有效地处理。

于 2013-11-07T12:11:53.780 回答
0

你认为他们应该做同样的工作的想法是不正确的。想象一下这个测试数据集:

T1

ID
----
1
2
3
4
5

T2

ID
---
1
1
1
2
2
3

DDL

CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (1), (1), (2), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

结果

ID
---
1
2
3

ID
---
1
1
1
2
2
3

只有当您搜索的列是唯一的时,您的结果才会相同。

CREATE TABLE dbo.T1 (ID INT NOT NULL);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

在此处输入图像描述

即使结果相同,但执行计划却不同。使用的第一个查询IN能够使用反半连接,这意味着它知道不需要 t2 中的数据,因此一旦找到单个匹配项,它就可以停止扫描进一步的匹配项。

如果您将第二个表限制为只有唯一值,那么您将看到相同的计划:

CREATE TABLE dbo.T1 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T1 (ID) VALUES (1), (2), (3), (4), (5);

CREATE TABLE dbo.T2 (ID INT NOT NULL PRIMARY KEY);
INSERT dbo.T2 (ID) VALUES (1), (2), (3);

SELECT  *
FROM    dbo.T1
WHERE   T1.ID IN (SELECT T2.ID FROM dbo.T2);

SELECT  T1.*
FROM    dbo.T1
        INNER JOIN dbo.T2
            ON T1.ID = T2.ID;

在此处输入图像描述

总之,这两个查询不会总是产生相同的结果,它们也不会总是有相同的计划。这实际上取决于您的索引和数据/查询的宽度。

于 2013-11-07T12:46:33.013 回答