1

我有两个 SQL 表,分别称为 t1 和 t2。两者都有列名 str_id。str_id 通常是一个 10 位的字符串,但我有特殊的 str_id,它以“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_ids 都有 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'
    );

我能做些什么来解决上面的查询?

4

3 回答 3

1

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

于 2013-10-17T23:38:32.997 回答
0

Edited my answer. Try running this instead

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'
于 2013-10-17T23:29:01.140 回答
0

所以,你是说t2.str_id值不包含'sp'前缀,而t1.str_id呢?您可能需要重新考虑您的数据模型。我怀疑当您尝试匹配时,有一个索引无法t1.str_id使用。subst(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'
 );
于 2013-10-17T23:38:01.990 回答