MySQL 中使用 any_value 子查詢時,WHERE IN 失效的原因是什么?

MySQL 中使用 any_value 子查詢時,WHERE IN 失效的原因是什么?

mysql 中使用 any_value 子查詢時,where in 失效的原因

mysql 中,使用 any_value 子查詢對分組后的數(shù)據(jù)進(jìn)行篩選時,可能會導(dǎo)致 where in 失效。這是因?yàn)?any_value 函數(shù)返回的是一組行中的第一個非空值,而 where in 操作符期望的是一系列明確的值。

在這種情況下,當(dāng)將 any_value 子查詢用作 where in 的子句時,查詢優(yōu)化器可能會將其轉(zhuǎn)換為內(nèi)部連接。內(nèi)部連接將 test 表中的每一行與 any_value 子查詢返回的行進(jìn)行匹配,從而導(dǎo)致返回整個 test 表。

解決方案:

為了解決這個問題,需要使用一個額外的 select 語句對 any_value 子查詢的結(jié)果進(jìn)行封裝。這會強(qiáng)制查詢優(yōu)化器將子查詢作為實(shí)際值表來處理,而不是內(nèi)部連接。

select * from test where id in (     select id     from (         select any_value(id) as id         from test         group by type     ) as temp );

第二個問題:未指定目標(biāo)表別名時的異常行為

當(dāng)在 any_value 子查詢中未指定目標(biāo)表別名時,mysql 不會報錯,并且會返回整個 test 表。這是因?yàn)?mysql 允許將子查詢的結(jié)果作為派生表處理。如果沒有指定別名,則 mysql 會根據(jù)子查詢的 group by 子句,自動生成一個派生表的名稱,格式為 group_by_table_

在示例中,未指定的子查詢的派生表名稱為 group_by_table_1。因此,當(dāng)使用錯誤的 select 語句時,實(shí)際執(zhí)行的查詢?nèi)缦拢?/p>

SELECT * FROM test WHERE id IN (     SELECT id     FROM GROUP_BY_TABLE_1 );

由于 group_by_table_1 包含整個 test 表,因此查詢返回了整個 test 表。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享