Create Dynamic SEO Friendly URL for Virtual Page

One approach could be to create a rewrite rule that will catch the 3 variables and provide them as parameters that can be passed on to your job template. Assuming your template slug is “job”:

function jobquery_rewrite_rule() {
    add_rewrite_rule(
        '^job/([^/]*)/([^/]*)/([^/]*)/?',
        'index.php?pagename=job&state=$matches[1]&city=$matches[2]&job=$matches[3]',
        'top'
    );
}
add_action( 'init', 'jobquery_rewrite_rule' );

After inserting this action into your theme, you must refresh the permalink rule cache by visiting Settings > Permalinks for this new rewrite rule to take effect.

These creates 3 new GET parameters that you can now access in your job template, but first you need to allow them to be accessed using query_vars_filter to create safe variables from each of them:

add_filter( 'query_vars', 'add_query_vars_filter' );
function add_query_vars_filter( $vars ) {
  $vars[] = 'state';
  $vars[] = 'city';
  $vars[] = 'job';
  return $vars;
}

Without having your full custom post structure or meta fields, it would be kind of tough for me to write what the query is, but somehow in your job template you should be able to capture these GET vars into vars you need to build a ‘reverse’ wp_query to get your post content for that job:

$state_var = get_query_var('state');
$city_var = get_query_var('city');
$job_var = get_query_var('job');

//Use something like this to find the job based off the passed params
$args = array(
    'post_type'  => 'job',
    'meta_query' => array(
        array(
            'key'     => 'job_state',
            'value'   => $state_var,
        ),
        array(
            'key'     => 'job_city',
            'value'   => $city_var,
        ),
        array(
            'key'     => 'job_title',
            'value'   => $job_var,
        ),
    ),
);
$query = new WP_Query( $args );