有没有一种方法可以在不使用“distinct”或“unique”子句的情况下消除重复数据?

问题描述 投票:0回答:2

由于组织限制,我无法使用 Distinct 或 Unique 子句。有没有办法修改代码以便不显示重复值? 我的代码如下:

`SELECT PER_PERSON_NAMES_F.TITLE,
               PER_PERSON_NAMES_F.FIRST_NAME,
               PER_PERSON_NAMES_F.LAST_NAME,
               PER_PERSON_NAMES_F.FULL_NAME,
               PER_PERSON_NAMES_F.DISPLAY_NAME,
FROM PER_PERSON_NAMES_F,PER_ALL_PEOPLE_F, PER_PERSONS
WHERE PER_PERSON_NAMES_F.PERSON_ID=PER_ALL_PEOPLE_F.PERSON_ID
AND PER_PERSON_NAMES_F.PERSON_ID=PER_PERSONS.PERSON_ID
AND PER_ALL_PEOPLE_F.PERSON_ID=PER_PERSONS.PERSON_ID
AND name_type='GLOBAL'
ORDER BY PER_PERSON_NAMES_F.FULL_NAME.`
sql oracle plsql oracle-fusion-middleware oracle-fusion-apps
2个回答
0
投票

有什么作用

由于组织限制

意思是?


一种选择是将 select 语句返回的所有列放入

group by
子句中:

  SELECT per_person_names_f.title,
         per_person_names_f.first_name,
         per_person_names_f.last_name,
         per_person_names_f.full_name,
         per_person_names_f.display_name
    FROM per_person_names_f, per_all_people_f, per_persons
   WHERE     per_person_names_f.person_id = per_all_people_f.person_id
         AND per_person_names_f.person_id = per_persons.person_id
         AND per_all_people_f.person_id = per_persons.person_id
         AND name_type = 'GLOBAL'
GROUP BY per_person_names_f.title,
         per_person_names_f.first_name,
         per_person_names_f.last_name,
         per_person_names_f.full_name,
         per_person_names_f.display_name
ORDER BY per_person_names_f.full_name

0
投票

使用

GROUP BY

SELECT n.TITLE,
       n.FIRST_NAME,
       n.LAST_NAME,
       n.FULL_NAME,
       n.DISPLAY_NAME
FROM   PER_PERSON_NAMES_F n
       INNER JOIN PER_ALL_PEOPLE_F ap
       ON n.PERSON_ID=ap.PERSON_ID
       INNER JOIN PER_PERSONS p
       ON  n.PERSON_ID=p.PERSON_ID
       AND ap.PERSON_ID=p.PERSON_ID
WHERE  name_type='GLOBAL'
GROUP BY
       n.TITLE,
       n.FIRST_NAME,
       n.LAST_NAME,
       n.FULL_NAME,
       n.DISPLAY_NAME
ORDER BY n.FULL_NAME

ROW_NUMBER
解析函数:

SELECT n.TITLE,
       n.FIRST_NAME,
       n.LAST_NAME,
       n.FULL_NAME,
       n.DISPLAY_NAME
FROM   (
  SELECT n.TITLE,
         n.FIRST_NAME,
         n.LAST_NAME,
         n.FULL_NAME,
         n.DISPLAY_NAME,
         ROW_NUMBER() OVER (PARTITION BY n.person_id) AS rn
  FROM   PER_PERSON_NAMES_F n
         INNER JOIN PER_ALL_PEOPLE_F ap
         ON n.PERSON_ID=ap.PERSON_ID
         INNER JOIN PER_PERSONS p
         ON  n.PERSON_ID=p.PERSON_ID
         AND ap.PERSON_ID=p.PERSON_ID
  WHERE  name_type='GLOBAL'
) n
WHERE    rn = 1
ORDER BY n.FULL_NAME

或者,由于重复项可能来自一对多联接,因此不要

JOIN
表使用
EXISTS
来代替:

SELECT n.TITLE,
       n.FIRST_NAME,
       n.LAST_NAME,
       n.FULL_NAME,
       n.DISPLAY_NAME
FROM   PER_PERSON_NAMES_F n
WHERE  EXISTS(
         SELECT 1
         FROM   PER_ALL_PEOPLE_F ap
                INNER JOIN PER_PERSONS p
                ON  ap.PERSON_ID=p.PERSON_ID
         WHERE  n.PERSON_ID=ap.PERSON_ID
         AND    p.name_type='GLOBAL'
       )
ORDER BY n.FULL_NAME
© www.soinside.com 2019 - 2024. All rights reserved.