3

我还在学习SQL。我以两种不同的方式完成了类似的查询,并且想知道哪个更好以及为什么。

UPDATE R
    SET R.something = 1
    FROM Table1 R
    JOIN Table2 U
    ON R.value1 = U.value2
    WHERE
        U.value3 BETWEEN 1 AND 5

或者

UPDATE R
    SET R.something = 1
    WHERE R.value1 IN
    (SELECT U.value2
    FROM U
    WHERE
        U.value3 BETWEEN 1 AND 5
    )
4

6 回答 6

2

你的问题没有单一的答案。SQL 是一种描述性语言,而不是一种过程语言。这取决于效率更高的数据库引擎。此外,索引会对性能产生很大影响。

顺便说一句,您的两个查询并不等效。当“U”中有多个值时,第一个可以返回多行。带有“IN”的版本会隐含“DISTINCT”。要解决此问题,您需要添加特定的“DISTINCT”。

UPDATE R
    SET R.something = 1
    FROM Table1 R
         JOIN (select distinct value2
               from Table2 U
               WHERE U.value3 BETWEEN 1 AND 5 
              ) u
         ON R.value1 = U.value2  

此外,虽然我个人喜欢更新中的“FROM”语句,但并非所有数据库都支持它。带有“IN”的版本兼容更广泛的数据库引擎。

于 2012-07-09T15:46:31.710 回答
1

第一个查询更好。

关系数据库,无论您使用的实际 DBMS 是什么,都是为了以这种方式连接数据并使用 where 子句对其进行过滤而构建的。这是他们的面包和黄油。在第二个查询中,您使用子查询来收集其他数据。这太酷了,关系数据库也能很好地解决这个问题。但是,对于子查询,在这种特定情况下,您最终会得到两个查询,一个是获取 U 数据,然后是外部查询,使用子查询中的数据来设置 R 数据。

这是棘手的一点。在您的查询中,您的子查询完全引用了一个单独的表。所以还是会很快。该子查询仅包含在 U 数据中。您将获得 2 个查询 - 获取 U 数据,然后使用 U 数据更新 R 数据。但是,如果您编写了一个类似的查询,其中子查询引用了 R 中的数据,那么您将不会得到两个单独的查询。您最终会对 R 中的所有数据进行全表扫描,这会相当慢。

为更完整而进行编辑:正如其他人所说,很大程度上取决于您使用的是什么 DBMS 以及它最擅长什么。当第一次学习 SQL(我绝不是专家)时,其中一个障碍是意识到有很多方法可以做同样的事情,得到同样的结果,然后往往最终会针对同样的事情进行优化. 因此,寻找“正确”的方式往往是徒劳的,因为没有明确的“正确”方式。我尝试编写不仅是为了正确性和速度,也是为了可维护性——我发现子查询对大脑来说可能比必要的更难。如果可以避免它们,我会尝试不使用它们(只要替代方案不是光标或其他东西:-D)。

于 2012-07-09T15:57:51.240 回答
1

这完全取决于您计划使用的数据库(Oracle、SQL Server 等)、它的版本,有时还取决于表中的数据量。但通常你应该更喜欢 JOIN,因为它们对大多数优化器来说更容易,并且带有空值的陷阱更少。

于 2012-07-09T15:46:40.987 回答
0

这可能取决于您使用的引擎,但我相信 MS SQL Server 会针对相同的查询计划进行优化。

如果引擎没有,我会建议在这种情况下它是劣质的。

于 2012-07-09T15:47:35.197 回答
0

使用 JOIN 查询会更好,因为它比子选择更快。

于 2012-07-09T15:41:39.293 回答
0

这取决于数据库和数据库版本搜索是否更好(更快)搜索 IN 或 JOIN 是否会返回不同的结果(IN 更快或 JOIN 更快)取决于数据库甚至 SQL 语句 - 它甚至可以根据数据库版本。使用多种数据大小和不同平台进行测试总是一个好主意!

(查询 #2 是最容易阅读的,但可能会也可能不会更慢)

于 2012-07-09T15:44:38.247 回答