Ottimo che hai trovato la soluzione ma, così a occhio, anzichè una union potresti fare una sola query con delle leftjoin.
La prima query che fai cerca dalla TABLE qualcosa che soddisfi la ricerca su TABLE_C.
La seconda query anche ma in join con un'altra tabella...
Nella prima quindi fai una left join tra TABLE e TABLE_SD e left join tra TABLE_SC e TABLE_C, prendendo ciò che ha qualcosa di corrispondente in TABLE_C.
Nella seconda invece fai la stessa cosa ma con TABLE_D anzichè TABLE_SC.
Ora...non ti conviene fare una unica left join tra le tabelle con le giuste condizioni?
Tipo
Nella order non ho capito dove risieda "label" ma basta metterci davanti l'alias della tabella.codice:select `t`.`ID` AS `deviceID` from `TABLE` as `t1` left join `TABLE_SD` as `t2` ON `t2`.`ID` = `t1`.`tablesd_id` left join `TABLE_C` as `t3` ON `t3`.`ID` = `t2`.`tablec_id` OR `t3`.`ID` = `t4`.`client_id` left join `TABLE_D` as `t4` ON `t4`.`ID` = `t1`.`tabled_id` where `t3`.`name` like ('%ubb%') order by `label` ASC
A rigor di logica dovrebbe funzionare, così come l'ho messa giù, ma sono relativamente di fretta e non ho ben capito la questione della label che può essere null ecc....
Prova :-)