我建议添加一个表来存储 TYPES 及其关联的优先级 - 如果您在表和类型表之间添加 FOREIGN KEY 约束,那么您可以断言该类型始终具有优先级。
获取优先级的另一种方法是创建一个函数,该函数将类型作为输入并返回一个优先级。它会提供与表格类似的功能,但更加模糊。
除此之外 - 我同意 @Ben 的观点,即分析函数是得出结果的最佳方式。
SQL Fiddle
Oracle 11g R2 架构设置:
CREATE TABLE types (
type VARCHAR2(20) PRIMARY KEY,
priority NUMBER(3)
)
/
INSERT INTO types
SELECT 'IT', 1 FROM DUAL
UNION ALL SELECT 'SALES', 2 FROM DUAL
UNION ALL SELECT 'FINANCE', 3 FROM DUAL
UNION ALL SELECT 'MARKETING', NULL FROM DUAL
/
CREATE TABLE minions (
name VARCHAR2(30),
type VARCHAR2(20),
region VARCHAR2(2),
FOREIGN KEY ( type ) REFERENCES types ( type )
)
/
INSERT INTO minions
SELECT 'john', 'IT', 'ny' FROM DUAL
UNION ALL SELECT 'john', 'SALES', 'ny' FROM DUAL
UNION ALL SELECT 'john', 'FINANCE', 'ny' FROM DUAL
UNION ALL SELECT 'john', 'MARKETING', 'ny' FROM DUAL
UNION ALL SELECT 'kevin', 'MARKETING', 'ny' FROM DUAL
UNION ALL SELECT 'lisa', 'SALES', 'ny' FROM DUAL
UNION ALL SELECT 'lisa', 'FINANCE', 'ny' FROM DUAL
/
查询 1:
SELECT name,
MAX( m.type ) KEEP ( DENSE_RANK FIRST ORDER BY priority ) AS type,
MAX( region ) KEEP ( DENSE_RANK FIRST ORDER BY priority ) AS region
FROM minions m
INNER JOIN
types t
ON ( m.type = t.type )
WHERE priority IS NOT NULL
GROUP BY name
ORDER BY name
Results:
| NAME | TYPE | REGION |
|------|-------|--------|
| john | IT | ny |
| lisa | SALES | ny |