我有两个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'
);
我可以做些什么来修复上面的查询?
答案 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_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'
);