对于Oracle SQL,在多个表和列之间获取不同的值

时间:2009-02-12 21:18:16

标签: oracle distinct

我有以下示例查询,

select o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE, l.COMPANY_ID 
from TABLE1 o, TABLE2 l 
where o.ENTRY_ID = l.ENTRY_ID 
and COMPANY_ID in (10, 11, 12, 13)

将返回一组类似于以下内容的数据:

ENTRY_ID, DESCRIPTION, ENTRY_DATE, COMPANY_ID
1, Description 1, 2/12/2008, 10
2, Description 2, 2/12/2008, 10
3, Description 3, 2/10/2008, 10
4, Description 4, 2/11/2008, 10
4, Description 4, 2/11/2008, 11
4, Description 4, 2/11/2008, 12
4, Description 4, 2/11/2008, 13

如果条目与多家公司相关联,则此查询将为与其关联的每家公司返回相同的条目1次。

我希望查询与COMPANY_ID不同,因此如果条目与多家公司相关联,则只返回一次。

这是我要返回的结果集:

ENTRY_ID, DESCRIPTION, ENTRY_DATE, COMPANY_ID
    1, Description 1, 2/12/2008, 10
    2, Description 2, 2/12/2008, 10
    3, Description 3, 2/10/2008, 10
    4, Description 4, 2/11/2008, 10

但是,以下也是可以接受的,

ENTRY_ID, DESCRIPTION, ENTRY_DATE, COMPANY_ID
    1, Description 1, 2/12/2008, 10
    2, Description 2, 2/12/2008, 10
    3, Description 3, 2/10/2008, 10
    4, Description 4, 2/11/2008, 11

我想要不同的ENTRY_ID。在我现在得到的结果集中,我得到了四个ENTRY_ID条目,因为有四个不同的公司共享该条目。我希望在多个公司之间共享条目时只返回一个条目。

3 个答案:

答案 0 :(得分:1)

SELECT ENTRY_ID, DESCRIPTION, ENTRY_DATE, COMPANY_ID
FROM (
  SELECT o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE, l.COMPANY_ID,
         ROW_NUMBER() OVER (PARTITION BY company_id ORDER BY entry_date DESC, entry_id DESC) AS rn
  FROM TABLE1 o, TABLE2 l 
  WHERE o.ENTRY_ID = l.ENTRY_ID 
    AND COMPANY_ID in (10, 11, 12, 13)
  )
WHERE rn = 1

这将返回最后一个ENTRY_DATE或更高ENTRY_ID的条目,其中有多个条目等于上一个ENTRY_DATE

答案 1 :(得分:0)

如果您愿意获得最大的COMPANY_ID返回:

select o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE, MAX( l.COMPANY_ID ) AS COMPANY_ID
from TABLE1 o, TABLE2 l 
where o.ENTRY_ID = l.ENTRY_ID 
and COMPANY_ID in (10, 11, 12, 13)
group by o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE;

答案 2 :(得分:0)

我希望查询与COMPANY_ID不同,因此如果条目与多家公司相关联,则只返回一次。

问题不明确,您是否需要不同的条目或不同的公司。也许您也可以显示您想要的输出,以便我们更好地理解。

如果您想要不同的条目,并且要与其一起列出的company_id,则查询无关紧要:

select * from (
select o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE, l.COMPANY_ID, row_number() over (partition by o.ENTRY_ID, o.DESCRIPTION, o.ENTRY_DATE order by l.COMPANY_ID) rn
from TABLE1 o, TABLE2 l 
where o.ENTRY_ID = l.ENTRY_ID 
and COMPANY_ID in (10, 11, 12, 13)
)
where rn=1;