相关疑难解决方法(0)

JOIN 条件和 WHERE 条件之间是否存在执行差异?

这两个示例查询之间是否存在性能差异?

查询 1:

select count(*)
from   table1 a
join   table2 b
on     b.key_col=a.key_col
where  b.tag = 'Y'
Run Code Online (Sandbox Code Playgroud)

查询 2;

select count(*)
from   table1 a
join   table2 b
on     b.key_col=a.key_col
   and b.tag = 'Y'
Run Code Online (Sandbox Code Playgroud)

注意唯一的区别是补充条件的位置;第一个使用WHERE子句,第二个将条件添加到ON子句中。

当我在 Teradata 系统上运行这些查询时,解释计划是相同的,JOIN 步骤显示了每种情况下的附加条件。但是,在关于 MySQL 的这个 SO 问题上,其中一个答案表明首选第二种样式,因为WHERE在进行连接之后进行处理。

编码这样的查询时是否有一般规则要遵循?我猜它必须依赖于平台,因为它显然对我的数据库没有影响,但这也许只是 Teradata 的一个功能。而如果它与平台相关的,我非常喜欢弄几个文件的参考资料; 我真的不知道该找什么。

mysql performance oracle

18
推荐指数
1
解决办法
7208
查看次数

MySQL子查询的问题

为什么这个查询

DELETE FROM test 
WHERE id = ( SELECT id 
             FROM (SELECT * FROM test) temp 
             ORDER BY RAND() 
             LIMIT 1
           );
Run Code Online (Sandbox Code Playgroud)

有时删除 1 行,有时删除 2 行,有时什么都不删除?

如果我用这种形式写:

SET @var = ( SELECT id 
             FROM (SELECT * FROM test) temp 
             ORDER BY RAND() 
             LIMIT 1
           ); 
DELETE FROM test 
WHERE id=@var;
Run Code Online (Sandbox Code Playgroud)

那么它可以正常工作 - 子查询有问题吗?

mysql

16
推荐指数
2
解决办法
6805
查看次数

嵌套 UPDATE 查询的问题

我无法进行更新查询。作为第一步,以下步骤可以正常工作:

UPDATE Tab1  
SET Tab1.a = '3'
WHERE
    Tab1.id IN ( 123, 456 );
Run Code Online (Sandbox Code Playgroud)

其中 id 是 Tab1 的主键。
但是,当我添加一个选择以获取 Tab1.id 必须在的值集时,我收到以下 MySQL 错误:

错误代码:1093
不能在 FROM 子句中指定目标表“Tab1”进行更新。

这是完整的查询:

UPDATE Tab1  
    SET Tab1.a = '3'
    WHERE
        Tab1.id IN ( 
            SELECT Tab1.id 
            FROM Tab1, Tab2 
            WHERE Tab1.b = Tab2.b AND Tab1.c = '4'
        );
Run Code Online (Sandbox Code Playgroud)

我看不出如何解决这个错误。
我是否被迫将此查询一分为二?

谢谢!

mysql update

2
推荐指数
1
解决办法
4451
查看次数

标签 统计

mysql ×3

oracle ×1

performance ×1

update ×1