CONCAT(me.nativeName,tp.nativeName) NOT IN (SELECT CONCAT(e_node,e_n_t)
FROM m_tp_info
WHERE m_id = mid)
有没有办法优化这个concat?
答案 0 :(得分:0)
对于大多数DBMS,我会以语义上有意义的方式处理这个问题:
SELECT ...
FROM ...
WHERE NOT EXISTS
( SELECT 1
FROM m_tp_info AS i
WHERE i.mid = me.m_id
AND CONCAT(i.e_node, i.e_n_t) = CONCAT(me.nativeName,tp.nativeName)
)
但MySQL通常会优化LEFT JOIN/IS NULL
better than NOT IN
or NOT EXISTS
,因此您可以尝试:
SELECT ...
FROM ...
LEFT JOIN m_tp_info AS i
ON i.mid = me.m_id
AND CONCAT(i.e_node, i.e_n_t) = CONCAT(me.nativeName,tp.nativeName)
WHERE i.mid IS NULL;
当然,如果你只是使用CONCAT
,你想要比较两列而NOT IN
不允许这样,那么你可以加入两列:
SELECT ...
FROM ...
LEFT JOIN m_tp_info AS i
ON i.mid = me.m_id
AND i.e_node = me.nativeName
AND i.e_n_t = tp.nativeName
WHERE i.mid IS NULL;
或者
SELECT ...
FROM ...
WHERE NOT EXISTS
( SELECT 1
FROM m_tp_info AS i
WHERE i.mid = me.m_id
AND i.e_node = me.nativeName
AND i.e_n_t = tp.nativeName
);