如何修复两个表联接以删除重复的行

时间:2019-01-29 15:56:08

标签: sql oracle

我有3个表,并且已经加入它们以完全输出所需的内容,但是现在我想删除重复的行,以使MISTI col不会显示重复的记录。我曾尝试使用Distinct,但仍然遇到问题。这是我的SQL查询,可以完全按照我希望的方式减去重复的记录。这也是我的输出的快照

OUTPUT

SELECT  g.entity                                      AS MISTI,
        t.cur_state                                   AS STATE,
        ROUND(((SYSDATE - t.cur_state_dttm) * 24), 2) AS HRS,
        te.technician
FROM Entity_Grp_Lst    g
    LEFT OUTER JOIN
        trk_id_def        t
            ON g.facility = t.facility
               AND g.grp_type = t.grp_type
               AND g.entity = t.entity
               AND g.grp_type = '720'
    LEFT JOIN
        trk_id_technician te
            ON t.facility = te.facility
               AND t.grp_type = te.grp_type
               AND t.trk_id = te.trk_id
               AND cur_state_dttm = te.state_in_dttm
WHERE t.cur_state NOT IN ('PROD', 'NM', 'TERM', 'NULL', 'IDLE', 'YER', 'PENG', 'LBQU', 'LBQS', 'I07', '20')
        AND Entity_Grp_type = '085'
        AND g.ENTITY_GRP = 'MET'
ORDER BY g.entity,
        t.cur_state_DTTM DESC;

2 个答案:

答案 0 :(得分:1)

它不起作用是因为您有一个与其他列不同的列,并且是“技术人员”列,正如您在发送“技术人员”或“小时”的屏幕截图中看到的那样,它是不同的,因此,即使您使用的distinct无效,因为如果有一些不同的值,基本上整个行都会有所不同,但我还是建议从select中删除“ technician”列:

Select DISTINCT
   g.entity as MISTI,
   t.cur_state      as STATE,
   ROUND(((SYSDATE-t.cur_state_dttm)*24),2) AS HRS

,然后尝试使用DISTINCT。

答案 1 :(得分:0)

这些不是重复记录,其他字段的值正在更改。 如果需要在MISTI上保留非重复值,可以执行以下操作:

SELECT  MISTI
        ,STATE
        ,HRS
        ,technician
FROM    (
        SELECT  g.entity                                      AS MISTI,
                t.cur_state                                   AS STATE,
                ROUND(((SYSDATE - t.cur_state_dttm) * 24), 2) AS HRS,
                te.technician
                ROW_NUMBER() over(partition by g.entity order by te.technician desc)  as rn
        FROM Entity_Grp_Lst    g
            LEFT OUTER JOIN
                trk_id_def        t
                    ON g.facility = t.facility
                       AND g.grp_type = t.grp_type
                       AND g.entity = t.entity
                       AND g.grp_type = '720'
            LEFT JOIN
                trk_id_technician te
                    ON t.facility = te.facility
                       AND t.grp_type = te.grp_type
                       AND t.trk_id = te.trk_id
                       AND cur_state_dttm = te.state_in_dttm
        WHERE t.cur_state NOT IN ('PROD', 'NM', 'TERM', 'NULL', 'IDLE', 'YER', 'PENG', 'LBQU', 'LBQS', 'I07', '20')
                AND Entity_Grp_type = '085'
                AND g.ENTITY_GRP = 'MET'
        )q
WHERE   q.rn = 1
ORDER   BY MISTI,HRS DESC

这会在MISTI上对行进行排名,而我只保留第一行,您可以更改order by子句以匹配您的需要。