public static void parseLeftNodeTableName(SqlNode leftJoin, List<Tuple2<String, String>> aliasAndRealTabName, Set<String> sideTableSet) {
        if (leftJoin.getKind() == IDENTIFIER) {
            SqlIdentifier sqlIdentifier = (SqlIdentifier) leftJoin;
            if (sqlIdentifier.names.size() == 1 && !sideTableSet.contains(sqlIdentifier.names.get(0))) {
                aliasAndRealTabName.add(new Tuple2<>(sqlIdentifier.names.get(0), sqlIdentifier.names.get(0)));
            }
        } else if (leftJoin.getKind() == AS) {
            SqlNode sqlNode = ((SqlBasicCall) leftJoin).getOperands()[0];
            if (sideTableSet.contains(sqlNode.toString())) {
                return;
            }
            if (sqlNode.getKind() == IDENTIFIER) {
                aliasAndRealTabName.add(new Tuple2<>(((SqlBasicCall) leftJoin).getOperands()[1].toString(), sqlNode.toString()));
            } else {
                // child query
                aliasAndRealTabName.add(new Tuple2<>(((SqlBasicCall) leftJoin).getOperands()[1].toString(), null));
            }
        } else if (leftJoin.getKind() == JOIN) {
            parseLeftNodeTableName(((SqlJoin) leftJoin).getLeft(), aliasAndRealTabName, sideTableSet);
            parseLeftNodeTableName(((SqlJoin) leftJoin).getRight(), aliasAndRealTabName, sideTableSet);
        }
    }
parse multi join table name, child query RealTabName is null
@param leftJoin
@param aliasAndRealTabName
core/src/main/java/com/dtstack/flink/sql/util/ParseUtils.java