Using hook_query_alter
hook_query_alter() is executed for every dynamic query run by Drupal. If you want to execute the hook for queries having a specific tag, you should implement hook_query_TAG_alter().

The code for getting the alias for the main table is similar to the following one.

function mymodule_get_main_table_alias($tables) {
  $alias = '';

  foreach ($tables as $id =&gt; $info) {
    // If 'join type' is not set, then it's the main table.a
    if (empty($info['join type'])) {
      $alias = $id;
    }
  }

  return $alias;
}


I would write then the hook code as follows.

function mymodule_query_term_access_alter(QueryAlterableInterface $query) { 
  global $user;
  if ($user-&gt;uid &gt; 1) {
    if (strstr(current_path(), 'admin/structure/taxonomy')) {
      if ($alias = mymodule_get_main_table_alias($query-&gt;getTables())) {
        $alias = $query-&gt;leftJoin('term_permissions_user', 'tpu', "$alias.tid = %alias.tid");      
        $query-&gt;condition(db_or()
          -&gt;isNullcondition("$alias.uid");        
          -&gt;condition("$alias.uid", $user-&gt;uid, '=')
        );          
      }
    }
  }
}


Notice that:


In $query-&gt;leftJoin(), %alias is replaced with the alias the query is using for the table  being joined. As you are altering an existing query, you cannot know if the alias you chose is already used.
The result of $query-&gt;leftJoin() is the alias being used for the joined table. It is better not to hard core that alias, for the reason said in the previous point.
To check if a field is NULL, you should not use QueryConditionInterface::condition(); as the documentation says, you should use QueryConditionInterface::isNull().
There is not need to create a QueryCondition object with db_and(); the conditions used to a query with $query-&gt;condition() are ANDed with each other.