MySQL:5.7.16版本
有两个表:
rule_conf
表格:
CREATE TABLE `rule_conf` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`app_id` bigint(20) UNSIGNED NOT NULL,
`app_log_id` bigint(20) UNSIGNED NOT NULL,
`r_type` tinyint(2) UNSIGNED NOT NULL,
`r_status` tinyint(2) UNSIGNED NOT NULL DEFAULT 0,
...
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_app_log_id`(`app_log_id`) USING BTREE,
INDEX `idx_app_id`(`app_id`) USING BTREE
) ENGINE = InnoDB
字符串
app_log_conf
表格:
CREATE TABLE `app_log_conf` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`app_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0,
...
INDEX `idx_app_id`(`app_id`) USING BTREE
) ENGINE = InnoDB
型
有一个SQL:
select app_id from rule_conf
where app_log_id = (
select max(id) from app_log_conf where app_id = 123 and r_status = 1 and r_type = 1
)
型
这个SQL返回一个空结果,而不是抛出一个错误,为什么?
在我的预期中,这个SQL应该抛出一个类似Unknown Column
的异常,但它没有。
当我在子查询aaa = 1
中添加一个条件,然后执行整体SQL时,我收到一个错误:1054 - Unknown column 'aaa' in 'where clause
,这是我的预期,因为表app_log_conf
实际上不包括列aaa
。
当我单独执行子查询时,我得到了一个错误:1054 - Unknown column 'r_status' in 'where clause
,这也是我的期待。
是否有可能是因为主查询中的表'rule_conf'包含这些列?
所以,有人遇到过这样的问题,或者有人能解释一下为什么?
谁能解释一下为什么
1条答案
按热度按时间qyyhg6bp1#
子查询知道主查询的列。如果在主查询表和子查询表中有相同的列名,并且您不限定子查询中所需的列名,则子查询表的列优先于主查询表的列。因此,您的查询可以翻译为:
字符串
当使用多个表时,应该用它们的表限定所有列名,以避免错误。使用别名表名有助于实现这一点。
子查询知道主查询的列有时是必要的,当我们想要写一个相关的子查询时,例如。
型