如何在With Query中完成多个联接?

时间:2019-06-07 18:14:59

标签: sql hadoop hive left-join inner-join

我想在下面的查询中完成其他内部联接,但是在创建临时表和内部联接后遇到语法错误。

WITH myPos
AS (
    SELECT row_number() OVER (
            PARTITION BY pr_emp_id ORDER BY db_last_upd
            ) AS RowNum
        ,pos.*
    FROM master.s_postn pos
    )

SELECT act.row_id
    ,People.SalesID
FROM master.s_evt_act act
INNER JOIN (
    SELECT myPos.RowNum AS update_count
        ,myPos.db_last_upd
        ,myPos.bu_id
        ,myPos.ou_id
        ,myPos.Name
        ,myPos.pr_emp_id
        ,regexp_extract(myPos.Name, '(\\d+)', 1) AS SalesID
    FROM myPos
    INNER JOIN (
        SELECT max(rowNum) maxRowNum
            ,pr_emp_id
        FROM myPos
        GROUP BY pr_emp_id
        ) AS maxPos ON myPos.pr_emp_id = maxPos.pr_emp_id
        AND myPos.rowNum = maxPos.maxRowNum
    WHERE lower(myPos.name) LIKE '% specifictitle %'
    ) AS People ON People.pr_emp_id = act.owner_per_id

在以下查询中捕获了其他数据:

    SELECT sr_num
        ,owner_per_id
        ,x_cs_mgr_txt
    FROM mastertable.s_srv_req AS req
    WHERE req.x_cs_mgr_txt IS NOT NULL
        AND req.sr_stat_id <> 'Closed'

此附加Join将为on req.owner_per_id = act.owner_per_id

我做了很多试验和错误,并认为我会有所帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

除了尝试以下操作外,还无需多说:

WITH myPos
AS (
    SELECT row_number() OVER (
            PARTITION BY pr_emp_id ORDER BY db_last_upd
            ) AS RowNum
        ,pos.*
    FROM master.s_postn pos
    )

SELECT act.row_id
    ,People.SalesID
FROM master.s_evt_act act
INNER JOIN (
    SELECT myPos.RowNum AS update_count
        ,myPos.db_last_upd
        ,myPos.bu_id
        ,myPos.ou_id
        ,myPos.Name
        ,myPos.pr_emp_id
        ,regexp_extract(myPos.Name, '(\\d+)', 1) AS SalesID
    FROM myPos
    INNER JOIN (
        SELECT max(rowNum) maxRowNum
            ,pr_emp_id
        FROM myPos
        GROUP BY pr_emp_id
        ) AS maxPos ON myPos.pr_emp_id = maxPos.pr_emp_id
        AND myPos.rowNum = maxPos.maxRowNum
    WHERE lower(myPos.name) LIKE '% specifictitle %'
    ) AS People ON People.pr_emp_id = act.owner_per_id
    INNER JOIN (
    SELECT sr_num
        ,owner_per_id
        ,x_cs_mgr_txt
    FROM mastertable.s_srv_req AS req
    WHERE req.x_cs_mgr_txt IS NOT NULL
        AND req.sr_stat_id <> 'Closed'
    ) AS req  ON req.owner_per_id = act.owner_per_id