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 表。