oracle select查询优先于列值

Posted

技术标签:

【中文标题】oracle select查询优先于列值【英文标题】:Oracle select query give priority to column value 【发布时间】:2013-11-29 10:51:53 【问题描述】:

我在一张表中有三列测试

name, type, region

示例值为:

john IT ny
john SALES ny
john FINANCE ny
lisa SALES ny
lisa FINANCE ny

在上述情况下,我怎样才能将优先级 1 分配给 IT,2 分配给销售,3 分配给财务。

我的意思是对于上面的示例记录,它应该给出 2 条记录

John IT ny
Lisa SALES ny

如果员工记录与 IT 一起显示,则应该只显示那些,如果不显示 SALES,如果不显示 Finance。

【问题讨论】:

【参考方案1】:

您需要选择一个,似乎 CASE 语句是最好的:

select name
     , max(type) keep (dense_rank first order by priority asc) as type
     , max(region) keep (dense_rank first order by priority asc) as region
  from ( select a.*
              , case type 
                     when 'IT' then 1
                     when 'SALES' then 2
                     when 'FINANCE' then 3
                end as priority 
           from my_table a
                )
 group by name

FIRST 函数根据指定的顺序选择排名第一的值。

【讨论】:

感谢您的询问。有效。顺便说一句,如果还有另一行,约翰 MARKETING ny 我不会忽略除 IT、销售和财务以外的记录 你加where type <> 'marketing,或者,where type in ('it','sales','finance')【参考方案2】:

我建议添加一个表来存储 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 |

【讨论】:

以上是关于oracle select查询优先于列值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 查询调优建议

Oracle常用的查询语句

oracle查询优化

查询oracle用户角色权限

oracle学习篇六:子查询

在 Oracle 中交换列值