2016-05-12 13 views
0
CONCAT(me.nativeName,tp.nativeName) NOT IN (SELECT CONCAT(e_node,e_n_t) 
                  FROM m_tp_info 
                  WHERE m_id = mid) 

この連結を最適化する手段はありますか?ほとんどのDBMSでConcat最適化

+0

はい、代わりconcated値の別々の列を比較します。 (おそらく、存在しないのは、null-safeであることです。) – jarlh

+0

@jarlhこれは、コンポーネントの部分が等しいとみなします。 'CONCAT( 'ABC'、 'DEF')= CONCAT( 'AB'、 'C​​DEF')'のようになりますが、2つの部分は等しくありません。 Niranjan、これが起こるかどうか確認できますか? – GarethD

+2

は、OPが何を望んでいるかに応じて、完全なクエリ – RomanPerekhrest

答えて

0

私は意味的に作る方法でこれに近づくだろう意味:もちろん

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; 

をあなたがた場合、:あなたが試みる場合がありますので

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を最適化します2つの列を比較し、NOT INがこれを許可しないため、

の2つの列を結合するだけでよいので、 CONCATを使用しています
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 
     );