SQL工作正常,直到我将SUBSTR添加到子查询,然后它挂起。为什么?

时间:2013-10-17 23:23:11

标签: mysql sql

我有两个SQL表,称​​之为t1和t2。两者都有列名str_id。 str_id通常是一个10位数的字符串,但我有一个特殊的str_ids,以'sp'开头,后跟一个正常的10位str_id。我想从t1中选择所有'sp'str_id,删除sp,然后在t2中查找str_id。我试过这个问题:

Select
    str_id,
    desired_column
From
    t2 
Where
    str_id in (
        Select
            substr(str_id, 3)
        From
            t1
        Where
            str_id Like 'sp%' and
            other_column = 'my_value'
    );

从语法上讲,这个命令似乎是正确的,但是当我运行它时,我的SQL前端就会挂起。如果我在没有SUBSTR的情况下运行命令,那么它执行正常,但它不会返回我想要的结果,因为所有str_id都有sp前缀。仅供参考,有效的命令是:

Select
    str_id, 
    desired_column 
From
    t2 
Where
    str_id In (
        Select
            str_id 
        From
            t1 
        Where
            str_id Like 'sp%' and 
            other_column = 'my_value'
    );

我可以做些什么来修复上面的查询?

3 个答案:

答案 0 :(得分:1)

显示这两个的EXPLAIN输出,但我假设正常的一个mysql能够指向交叉引用索引,而SUBSTR需要创建一个中间结果集,并检查每个单独的项目T2。这是一个很好的例子,为什么前缀值与重要数据的前缀与在1列中存储分隔字符串的人一样糟糕:难以使用。

答案 1 :(得分:0)

编辑我的回答。尝试运行此代码

SELECT str_id,
(
SELECT desired_column
FROM t2
WHERE str_id = SUBSTR(t1.str_id, 3)
)
FROM t1
WHERE str_id LIKE 'sp%' AND other_column = 'my_value'

答案 2 :(得分:0)

所以,你说t2.str_id值不包含'sp'前缀,而t1.str_id呢?您可能想重新考虑您的数据模型。我怀疑当您尝试将t1.str_idsubst(t1.str_id,3)匹配时,t2.str_id上有一个索引无法使用。

根据表格的相对大小,这可能会更快:

SELECT 
 str_id, desired_column 
FROM 
 t2 
WHERE 
 concat( 'sp' , str_id ) IN (
    SELECT str_id FROM t1 
    WHERE str_id LIKE 'sp%' and other_column = 'my_value'
 );