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

Gibt es eine Möglichkeit, diese Concat zu optimieren?Concat Optimierung

+0

Ja, zu vergleichen separaten Spalten anstelle der concated Werte. (Vielleicht sollte ein NICHT vorhanden sein, um null-sicher zu sein.) – jarlh

+0

@jarlh Das würde annehmen, dass die Komponententeile gleich sind, z. 'CONCAT ('ABC', 'DEF') = CONCAT ('AB', 'CDEF')', jedoch sind die zwei Komponententeile nicht gleich. Niranjan, kannst du bestätigen, dass das passieren könnte? – GarethD

+2

zeigen Sie die vollständige Abfrage – RomanPerekhrest

Antwort

0

Bei den meisten DBMS Ich würde diesen Ansatz in der Art und Weise, die semantisch sinnvoll ist:

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) 
     ) 

Aber MySQL wird in der Regel LEFT JOIN/IS NULL better than NOT IN or NOT EXISTS optimieren, so dass Sie versuchen könnten:

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; 

Natürlich, wenn Sie Verwenden Sie einfach CONCAT, weil Sie zwei Spalten vergleichen möchten und NOT IN dies nicht zulässt, dann können Sie einfach die beiden Spalten verbinden:

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; 

Oder

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 
     );