protected function getDialectStatement(
        /*# string */ $method,
        /*# bool */ $setTable = true
    )/*# StatementInterface */ {
        // dialect
        $dialect = $this->getDialect();

        // check method
        if (!method_exists($dialect, $method)) {
            throw new BadMethodCallException(
                Message::get(Message::BUILDER_UNKNOWN_METHOD, $method),
                Message::BUILDER_UNKNOWN_METHOD
            );
        }

        /* @var $statement StatementInterface */
        $statement = call_user_func([$dialect, $method], $this);

        // prevous statement like in UNION
        if ($this->hasPrevious()) {
            $statement->setPrevious($this->getPrevious());
            $this->setPrevious(null);

        // set tables
        } elseif ($setTable && count($this->tables)) {
            if (method_exists($statement, 'from')) {

                // FROM all tables
                $statement->from($this->tables);
            } else {

                // INTO the first table
                $statement->into($this->tables[array_keys($this->tables)[0]]);
            }
        }

        return $statement;
    }