由于组织限制,我无法使用 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.`
有什么作用
由于组织限制
意思是?
一种选择是将 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
使用
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