我还在学习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
)
答案 0 :(得分: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”的版本兼容更广泛的数据库引擎。
答案 1 :(得分:1)
这一切都取决于您计划使用的数据库(Oracle,SQL Server等),其版本以及有时基于表中的数据量。但通常你应该更喜欢JOIN,因为它们对于大多数优化器来说更容易,并且具有更少的带有空值的陷阱。
答案 2 :(得分:1)
首先查询更好。
关系数据库,无论您使用的是哪个实际DBMS,都是为了以这种方式连接数据并使用where子句对其进行过滤而构建的。这是他们的面包和黄油。在第二个查询中,您使用子查询来收集其他数据。这非常酷,关系型数据库也会很好地完成。但是,使用子查询,在这种特定情况下,您将最终得到两个查询,一个用于获取U数据,然后外部查询将使用子查询中的数据来设置R数据。 / p>
虽然这是一个棘手的问题。在查询中,子查询完全引用单独的表。所以它仍然很快。该子查询仅包含在U数据中。您将获得2个查询 - 获取U数据,然后使用U数据更新R数据。但是如果您编写了一个类似的查询,其中子查询引用了R中的数据,那么您将不会获得两个单独的查询。你最终会对R中的所有数据进行全表扫描,这会相当慢。
编辑以获得更完整性:正如其他人所说,其中很多都归结为您正在使用的DBMS以及它最擅长的内容。当第一次学习SQL(我不是专家)时,其中一个障碍是意识到有很多方法可以做同样的事情,得到相同的结果,然后经常最终得到优化到同一个东西。所以找到“正确”的方式通常是徒劳的,因为没有明确的“正确”方式。我试着写不仅仅是为了正确性和速度,还为了可维护性 - 我发现子查询在大脑上可能比必要时更难。如果我可以避免它们,我会尝试不使用它们(只要替代品不是光标或其他东西:-D)。
答案 3 :(得分:0)
最好用JOIN查询,因为它比子选择更快。
答案 4 :(得分:0)
这取决于数据库和数据库版本 搜索IN或JOIN是否更好(更快)返回不同 结果(IN更快或JOIN更快)取决于数据库 甚至在SQL语句上 - 它甚至可以根据而改变 数据库版本。使用多个数据进行测试总是一个好主意 尺寸和不同的平台!
(查询#2是最容易阅读的,但可能会或可能不会慢)
答案 5 :(得分:0)
这可能取决于您使用的引擎,但我相信MS SQL Server会优化两个相同的查询计划。
如果发动机没有,我会建议它在这种情况下是劣质的。